Java中Thread的常用方法


 

 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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM