天天看點

Java并行程式設計–從并行任務集擷取回報

Java并行程式設計–從并行任務集擷取回報

在并行任務啟動後,強制性地從并行任務得到回報。

假想有一個程式,可以發送批郵件,還使用了多線程機制。你想知道有多少郵件成功發送嗎?你想知道在實際發送過程期間,這個批處理工作的實時進展嗎?

要實作多線程的這種回報,我們可以使用Callable接口。此接口的工作方式基本上與Runnable相同,但是執行方法(call())會傳回一個值,該值反映了執行計算的結果。

注意:Callable接口可用于傳回任意資料類型,是以我們的任務可以傳回我們需要的任何資訊。

現在,我們使用一個線程池ExecutorService來發送郵件,由于我們的任務是以Callable接口實作的,我們送出執行的每個新任務,都會得到一個Future引用。注意我們要使用直接的構造器建立ExecutorService,而不是使用來自Executors的工具方法建立。這是因為使用指定類ThreadPoolExecutor提供了一些方法可以派上用場。

執行這個類,輸出結果如下:

所有的任務都由ExecutorService送出,我們開始它的關閉(防止送出新任務)并使用一個循環(實時場景,可能你會繼續做其它的事情)來等待,直至所有任務都被執行完成、計算和列印目前每次疊代的進度。

注意,你可以存儲executor引用,也可以在任意時間從其它線程查詢它的計算結果和報告程序進度。

最後,使用Future集合引用,我們得到ExecutorService送出的每個Callable接口,通知成功發送的郵件數量和發送失敗的郵件數量。

此結構不但易于使用,還使得相關性得到清晰的隔離,在排程程式和實際任務之間提供了一個預定義的通信機制。