JAVA多線程實現的三種方式和帶返回值實現

一、JAVA多線程實現的四種方式java

  • 繼承Thread類
  • 實現Runnable接口
  • 實現Callable接口經過FutureTask包裝器來建立Thread線程
  • 使用ExecutorService、Callable、Future實現有返回結果的多線程

二、繼承Thread類建立線程多線程

  • Thread類本質上是實現了Runnable接口的一個實例
  • 表明一個線程的實例
  • 啓動線程的惟一方法就是經過Thread類的start()實例方法
  • start()方法是一個native方法,它將啓動一個新線程,並執行run()方法

三、實現Runnable接口建立線程併發

  • 實現Runnable接口
  • 繼承 Thread 有弊端,java是單繼承的

  • 啓動MyThread,須要首先實例化一個Thread,並傳入本身的MyThread實例

四、實現Callable接口經過FutureTask包裝器來建立Thread線程this

  • Callable接口(也只有一個方法)定義以下:

  • 用法以下:

五、使用ExecutorService、Callable、Future實現有返回結果的線程線程

  • 可返回值的任務必須實現Callable接口
  • 無返回值的任務必須實現Runnable接口
  • 執行Callable任務後,能夠獲取一個Future的對象,在該對象上調用get就能夠獲取到Callable任務返回的Object
  • 注意:get方法是阻塞的,即:線程無返回結果,get方法會一直等待
/** 
* 有返回值的線程 
*/  
@SuppressWarnings("unchecked")  
public class Test {  
public static void main(String[] args) throws ExecutionException,  
    InterruptedException {  
   System.out.println("----程序開始運行----");  
   Date date1 = new Date();  
  
   int taskSize = 5;  
   // 建立一個線程池  
   ExecutorService pool = Executors.newFixedThreadPool(taskSize);  
   // 建立多個有返回值的任務  
   List<Future> list = new ArrayList<Future>();  
   for (int i = 0; i < taskSize; i++) {  
    Callable c = new MyCallable(i + " ");  
    // 執行任務並獲取Future對象  
    Future f = pool.submit(c);  
    // System.out.println(">>>" + f.get().toString());  
    list.add(f);  
   }  
   // 關閉線程池  
   pool.shutdown();  
  
   // 獲取全部併發任務的運行結果  
   for (Future f : list) {  
    // 從Future對象上獲取任務的返回值,並輸出到控制檯  
    System.out.println(">>>" + f.get().toString());  
   }  
  
   Date date2 = new Date();  
   System.out.println("----程序結束運行----,程序運行時間【"  
     + (date2.getTime() - date1.getTime()) + "毫秒】");  
}  
}  
  
class MyCallable implements Callable<Object> {  
private String taskNum;  
  
MyCallable(String taskNum) {  
   this.taskNum = taskNum;  
}  
  
public Object call() throws Exception {  
   System.out.println(">>>" + taskNum + "任務啓動");  
   Date dateTmp1 = new Date();  
   Thread.sleep(1000);  
   Date dateTmp2 = new Date();  
   long time = dateTmp2.getTime() - dateTmp1.getTime();  
   System.out.println(">>>" + taskNum + "任務終止");  
   return taskNum + "任務返回運行結果,當前任務時間【" + time + "毫秒】";  
}  
}
相關文章
相關標籤/搜索