階段案例——製作服裝推廣軟文
阿新 • • 發佈:2022-04-11
Java中多執行緒的應用是非常多的,我們在Java中又該如何去建立執行緒呢?
http://www.jianshu.com/p/40d4c7aebd66
一、常用的有三種方法來建立多執行緒
- 新建一個類繼承自Thread類,具體步驟如下:
- 定義Thread類的子類,並重寫該類的run方法,該run方法的方法體就代表了執行緒要完成的任務。因此把run()方法稱為執行體。
- 建立Thread子類的例項,即建立了執行緒物件。
- 呼叫執行緒物件的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,具體步驟如下:
- 定義runnable介面的實現類,並重寫該介面的run()方法,該run()方法的方法體同樣是該執行緒的執行緒執行體。
- 建立 Runnable實現類的例項,並依此例項作為Thread的target來建立Thread物件,該Thread物件才是真正的執行緒物件。
- 呼叫執行緒物件的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建立執行緒,具體步驟如下:
- 建立Callable介面的實現類,並實現call()方法,該call()方法將作為執行緒執行體,並且有返回值。
- 建立Callable實現類的例項,使用FutureTask類來包裝Callable物件,該FutureTask物件封裝了該Callable物件的call()方法的返回值。
- 使用FutureTask物件作為Thread物件的target建立並啟動新執行緒。
- 呼叫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類,所以不能再繼承其他父類。