1 /* 2 *Thread常用方法 3 *1.start():啟動當前的線程,調用當前線程的run() 4 *2.run():通常需要重寫Thread類中的此方法,將創建要執行的操作聲明在此方法中 5 *3.currentThread():靜態方法,返回代碼執行的線程 6 *4.getName():獲取當前線程的名字 7 *5.setName():設置當前線程的名字 8 *6.yield():釋放當前CPU的執行 9 *7.join():在線程a中調用線程b的join()方法,此時線程a進入阻塞狀態 10 *8.stop():已過時的方法,當執行此方法是,強制結束當前進程 11 *9.sleep(long millitime):讓當前進程睡眠指定的毫秒數,在指定時間內,線程是阻塞狀態 12 *10.isAlive():判斷進程是否存活 13 */ 14 class HelloThread extends Thread 15 { 16 public void run() 17 { 18 for(int i=1;i<20;i++) 19 { 20 if((i&1)==0) 21 {/* 22 sleep(),是靜態的可以直接通過類調用,會拋異常 23 HelloThread是繼承在Thread里的,在Thread里run()沒有拋異常(子類重寫方法拋出的異常<=父類被重寫異常拋出的方法), 24 所以此處不可以throws,只能用try-catch 25 */ 26 try { 27 sleep(1000);//阻塞1000ms,即1s 28 } catch (InterruptedException e) { 29 // TODO Auto-generated catch block 30 e.printStackTrace(); 31 } 32 //在1s阻塞后,等CPU分配資源再運行主程序 33 System.out.println(Thread.currentThread().getName()+":"+i); 34 } 35 if(i%10==0) 36 { 37 this.yield(); 38 } 39 } 40 } 41 /*在源碼中可以看到 Thread有對於名字命名的構造器 42 * public Thread(String name) { 43 * init(null, null, name, 0); 44 * } 45 * 所以子類繼承父類的構造器就行 46 */ 47 /* 48 public HelloThread(String name) 49 { 50 super(name); 51 } 52 */ 53 } 54 public class test{ 55 public static void main(String[] args) { 56 //給線程命名方法1 調用setName() 57 HelloThread h1=new HelloThread(); 58 HelloThread h2=new HelloThread(); 59 h1.setName("*1*"); 60 h2.setName("*2*"); 61 h1.start(); 62 h2.start(); 63 //給線程命名方法2 建立類對象,調用構造器 64 /* 65 *HelloThread h2=new HelloTHread("*2*"); 66 */ 67 //給主線程命名 68 Thread.currentThread().setName("主線程"); 69 for(int i=0;i<20;i++) 70 { 71 if((i&1)==1) 72 { 73 System.out.println(Thread.currentThread().getName()+":"+i); 74 } 75 if(i==10) 76 { 77 try {//主線程中調用h1的join()方法,此時主線程進入阻塞狀態 78 h1.join();//join是Thread中的方法,不是該類中的方法,只能通過繼承Thread類的子類對象調用 79 } catch (InterruptedException e) { 80 // TODO Auto-generated catch block 81 e.printStackTrace(); 82 } 83 } 84 } 85 } 86 }
通過上述學習的方法,我們來完成一個具體的例子。
創建三個窗口共賣100張票。(暫時忽略線程不安全即出現重票現象)
1.通過類繼承Thread實現
1 //創建三個窗口共賣100張票 2 3 class Window extends Thread 4 { 5 private static int ticket=100; 6 public void run() 7 { 8 while(true) 9 { 10 if(ticket>0) 11 { 12 System.out.println(getName()+":賣票,票號為:"+ticket); 13 ticket--; 14 } 15 else 16 break; 17 } 18 } 19 } 20 public class test 21 { 22 public static void main(String[] args) 23 { 24 Window t1=new Window(); 25 Window t2=new Window(); 26 Window t3=new Window(); 27 t1.setName("*1*"); 28 t2.setName("*2*"); 29 t3.setName("*3*"); 30 t1.start(); 31 t2.start(); 32 t3.start(); 33 } 34 }
2.通過類調用接口實現
1 //創建三個窗口共賣100張票 2 class Window implements Runnable 3 { 4 private int ticket=100; 5 public void run() 6 { 7 while(true) 8 { 9 if(ticket>0) 10 { 11 System.out.println(Thread.currentThread().getName()+"賣票,票號為:"+ticket); 12 ticket--; 13 } 14 else 15 break; 16 } 17 } 18 } 19 public class test{ 20 public static void main(String[] args) { 21 Window w=new Window();//因為只造了一個Window類對象,3個線程公用一個進程,所以不用把ticket聲明為靜態的 22 Thread t1=new Thread(w); 23 Thread t2=new Thread(w); 24 Thread t3=new Thread(w); 25 t1.setName("1"); 26 t1.setName("2"); 27 t1.setName("3"); 28 t1.start(); 29 t2.start(); 30 t3.start(); 31 } 32 }