本系列關於concurrent的代碼示例,是被我分割成了小部分,在系列文章結束之後,我會將較爲完整的代碼上傳,在寫的過程當中我會參考官方API以及其餘牛人的看法,你們有不一樣的見解能夠在下面回覆。java
這一篇咱們繼續講concurrent包下面的接口,本篇講Callable
、 AsynchronousCompletionTask
、CompletionService
、CompletionService
;其實這四個接口內容不算多就是概念型的,固然他們並非用不到的。web
實現Callable接口的類其實就是一個能夠返回結果的任務,而且能夠拋出異常。 經過ExecutorService.submit
方法提交一個callable任務,而且經過Future對象來得到結果。 Future對象能夠取消運行任務,設置等待時間,獲取任務狀態,最終得到任務結果。Callable相似於 Runnable,可是runnable並不會有返回結果和異常信息。這一點咱們須要區別開。dom
一個標記接口識別異步任務的異步方法。他能夠提供監控,調試和跟蹤異步活動。異步
ExecutorService的擴展,能夠得到線程執行結果。
代碼示例:工具
import java.util.concurrent.Callable; import java.util.concurrent.CompletionService; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorCompletionService; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; public class TestCompletionService { public static void main(String[] args) throws InterruptedException, ExecutionException { ExecutorService exec = Executors.newFixedThreadPool(10); CompletionService serv = new ExecutorCompletionService(exec); for (int index = 0; index < 5; index++) { final int NO = index; Callable downImg = new Callable() { public String call() throws Exception { Thread.sleep((long) (Math.random() * 10000)); return "Downloaded Image " + NO; } }; serv.submit(downImg); } Thread.sleep(1000 * 2); System.out.println("Show web content"); for (int index = 0; index < 5; index++) { Future task = serv.take(); String img = (String)task.get(); System.out.println(img); } System.out.println("End"); // 關閉線程池 exec.shutdown(); } }
異步計算中可能出現的一個階段,也就是說當一個CompletionStage 完成時執行的動做或計算。
其實拆開來看就是,一個階段的執行可能會觸發完成一個單一的階段,或兩個階段,或多個階段。在一個階段的依賴關係被安排使用的方法與前綴。由兩個階段完成所觸發的,能夠結合他們的結果或效果,使用相應命名的方法。由兩個階段所觸發的,沒有保證的結果用於依賴階段的計算。這個類呢能夠說讓人很難取捨到底何時用,何時須要作幾個階段的處理計算。這個其實根據你們的業務考慮使用與否,畢竟他只是一個工具,即便有相同業務也可使用別的方式實現。線程