1. 程式人生 > 其它 >階段案例——製作服裝推廣軟文

階段案例——製作服裝推廣軟文

  Java中多執行緒的應用是非常多的,我們在Java中又該如何去建立執行緒呢?

http://www.jianshu.com/p/40d4c7aebd66

一、常用的有三種方法來建立多執行緒

  • 新建一個類繼承自Thread類,具體步驟如下:
    1. 定義Thread類的子類,並重寫該類的run方法,該run方法的方法體就代表了執行緒要完成的任務。因此把run()方法稱為執行體。
    2. 建立Thread子類的例項,即建立了執行緒物件。
    3. 呼叫執行緒物件的start()方法來啟動該執行緒
 1 public class FirstThreadTest extends Thread{  
 2     int i = 0;  
 3     //重寫run方法,run方法的方法體就是現場執行體  
 4     public void run()  
 5     {  
 6         for(;i<100;i++){  
 7         System.out.println(getName()+"  "+i);  
 8           
 9         }  
10     }  
11     public static void main(String[] args)  
12     {  
13         for(int i = 0;i< 100;i++)  
14         {  
15             System.out.println(Thread.currentThread().getName()+"  : "+i);  
16             if(i==20)  
17             {  
18                 //建立例項,並呼叫其start()方法啟動執行緒
19                 new FirstThreadTest().start();  
20                 new FirstThreadTest().start();  
21             }  
22         }  
23     }  
24 }
  • 新建一個類實現介面Runnable,具體步驟如下:
    1. 定義runnable介面的實現類,並重寫該介面的run()方法,該run()方法的方法體同樣是該執行緒的執行緒執行體。
    2. 建立 Runnable實現類的例項,並依此例項作為Thread的target來建立Thread物件,該Thread物件才是真正的執行緒物件。
    3. 呼叫執行緒物件的start()方法來啟動該執行緒。
 1 public class RunnableThreadTest implements Runnable  
 2 {  
 3     private int i;  
 4     //重寫run()方法
 5     public void run()  
 6     {  
 7         for(i = 0;i <100;i++)  
 8         {  
 9             System.out.println(Thread.currentThread().getName()+" "+i);  
10         }  
11     }  
12     public static void main(String[] args)  
13     {  
14         for(int i = 0;i < 100;i++)  
15         {  
16             System.out.println(Thread.currentThread().getName()+" "+i);  
17             if(i==20)  
18             {  
19                 //用實現類的物件作為引數傳入new Thread(Runnable obj)來建立Thread物件,然後呼叫start()方法啟動執行緒
20                 RunnableThreadTest rtt = new RunnableThreadTest();  
21                 new Thread(rtt,"新執行緒1").start();  
22                 new Thread(rtt,"新執行緒2").start();  
23             }  
24         }  
25     }  
26 }
  • 通過Callable和Future建立執行緒,具體步驟如下:
    1. 建立Callable介面的實現類,並實現call()方法,該call()方法將作為執行緒執行體,並且有返回值。
    2. 建立Callable實現類的例項,使用FutureTask類來包裝Callable物件,該FutureTask物件封裝了該Callable物件的call()方法的返回值
    3. 使用FutureTask物件作為Thread物件的target建立並啟動新執行緒
    4. 呼叫FutureTask物件的get()方法來獲得子執行緒執行結束後的返回值
 1 public class CallableThreadTest implements Callable<Integer>  
 2 {  
 3   
 4     public static void main(String[] args)  
 5     {  
 6         CallableThreadTest ctt = new CallableThreadTest();  
 7         FutureTask<Integer> ft = new FutureTask<>(ctt);  
 8         for(int i = 0;i < 100;i++)  
 9         {  
10             System.out.println(Thread.currentThread().getName()+" 的迴圈變數i的值"+i);  
11             if(i==20)  
12             {  
13                 new Thread(ft,"有返回值的執行緒").start();  
14             }  
15         }  
16         try  
17         {  
18             System.out.println("子執行緒的返回值:"+ft.get());  
19         } catch (InterruptedException e)  
20         {  
21             e.printStackTrace();  
22         } catch (ExecutionException e)  
23         {  
24             e.printStackTrace();  
25         }   
26     }  
27   
28     @Override  
29     public Integer call() throws Exception  
30     {  
31         int i = 0;  
32         for(;i<100;i++)  
33         {  
34             System.out.println(Thread.currentThread().getName()+" "+i);  
35         }  
36         return i;  
37     }  
38 }

二、建立執行緒的三種方式的對比

  採用實現Runnable、Callable介面的方式創見多執行緒時,優勢是

  • 執行緒類只是實現了Runnable介面或Callable介面,還可以繼承其他類。
  • 在這種方式下,多個執行緒可以共享同一個target物件,所以非常適合多個相同執行緒來處理同一份資源的情況,從而可以將CPU、程式碼和資料分開,形成清晰的模型,較好地體現了面向物件的思想。

劣勢是:

  • 程式設計稍微複雜,如果要訪問當前執行緒,則必須使用Thread.currentThread()方法

  使用繼承Thread類的方式建立多執行緒時優勢是:

  • 編寫簡單,如果需要訪問當前執行緒,則無需使用Thread.currentThread()方法,直接使用this即可獲得當前執行緒。

劣勢是:

  • 執行緒類已經繼承了Thread類,所以不能再繼承其他父類