Thread 創建的三種方式
阿新 • • 發佈:2018-11-29
nbsp 三種 實現類 col package stub net one 獲得
轉載自 https://blog.csdn.net/hellorichen/article/details/53127719
Java中創建線程主要有三種方式:
一、繼承Thread類創建線程類
①定義Thread類的子類,並重寫run方法。
②創建Thread子類的實例。
③調用start()方法。
訪問當前線程:Thread.currentThread().
二、通過Runnable接口創建線程類
同上,只是改為定義runnable接口的實現類。
啟動 new Thread(Runnable r,String name).start();
例:
1 new Thread(new Run(),"r1").start();
Run為Runnable接口的實現類。或者寫為:
1 package thread; 2 3 public class Main { 4 public static void main(String[] args) { 5 new Thread(new Runnable(){ 6 @Override 7 public void run() { 8 System.out.println("run()"); 9 }},"r1").start();10 } 11 }
接口不可實例化,所以參數必須為實現接口的類或匿名類。
三、通過Callable和FutureTask創建線程
①創建Callable接口的實現類,並實現call()方法,該call()方法將作為線程執行體,並且有返回值。
1 package thread; 2 3 import java.util.concurrent.Callable; 4 5 public class MyCallable implements Callable<Integer>{ 6 @Override 7 public Integer call() throwsException { 8 // TODO Auto-generated method stub 9 return 1111; 10 } 11 12 }
②創建Callable實現類的實例,使用FutureTask類來包裝Callable對象,該FutureTask對象封裝了該Callable對象的call()方法的返回值。
③使用FutureTask對象作為Thread對象的target創建並啟動新線程,FutureTask是Runnable的子類
④調用FutureTask對象的get()方法來獲得子線程執行結束後的返回值
1 package thread; 2 3 import java.util.concurrent.ExecutionException; 4 import java.util.concurrent.FutureTask; 5 6 public class Main{ 7 public static void main(String[] args) { 8 FutureTask<Integer> ft = new FutureTask<>(new MyCallable()); 9 new Thread(ft).start(); 10 try { 11 System.out.println(ft.get()); 12 } catch (InterruptedException e) { 13 // TODO Auto-generated catch block 14 e.printStackTrace(); 15 } catch (ExecutionException e) { 16 // TODO Auto-generated catch block 17 e.printStackTrace(); 18 } 19 } 20 }
使用接口實現線程的好處:
多個線程可共享一個target對象,所以非常適合多個相同線程來處理同一份資源的情況,從而將CPU、代碼和數據分開,形成清晰的模型,較好地體現了面向對象的思想。
Thread 創建的三種方式