images idt -c mage dex gem 傳遞 ont jdk源碼

一、Callable

我們知道啟動線程有以下兩種方式(jdk源碼註釋中官方定義只有兩種啟動方式,callable不算線程啟動方式) 原文鏈接:http://www.studyshare.cn/blog-front/blog/details/1141

(1)、new Thread().start()

(2)、new Thread(new Runnable()).start();

以上兩種方式中的run()方法的返回值是void類型,即沒有返回值,如果我們需要在業務線程中執行業務代碼後需要將結果進行返回怎麽辦呢?即使用Callable,如下:

技術分享圖片

二、調用方式

當使用Callable定義後如何調用,我們發現Thread類並沒有接收Callable參數的構造方法,只有接收Runnable接口參數的構造方法,此時我們需要用到一個包裝類FutrueTask將Callable進行包裝,包裝成Runnable,然後傳遞給Thread的構造方法即可。

技術分享圖片

運行後結果輸出:1

三、FutrueTask與Future源碼分析

1、FutrueTask類實現了RunnableFutrue接口,如下圖

技術分享圖片

2、RunnableFutrue接口繼承了Runnable和Futrue接口,如下圖

技術分享圖片

由上圖即可發現,FutrueTask類間接的實現了Runnable接口,從而可以使用new Thread(new FutrueTask(callable))去調用線程的start()方法啟動線程。

3、繼續進入Future接口中會發現get()方法

技術分享圖片

因此FutrueTask可以通過調用get()方法獲取到返回的結果。用一張圖來總結以上幾個類和接口之間的關系,如下圖:

技術分享圖片

更多深度技術好文:http://www.studyshare.cn/blog-front//index

線程之Callable、Future 和FutureTask使用及源碼分析