摘要:通過方法提交一個任務,并且通過對象來獲得結果。對象可以取消運行任務,設置等待時間,獲取任務狀態,最終獲得任務結果。類似于,但是并不會有返回結果和異常信息。由兩個階段所觸發的,沒有保證的結果用于依賴階段的計算。
本系列關于concurrent的代碼示例,是被我分割成了小部分,在系列文章結束以后,我會將較為完整的代碼上傳,在寫的過程中我會參考官方API以及其他牛人的見解,大家有不同的看法可以在下面回復。
這一篇我們繼續講concurrent包下面的接口,本篇講Callable、 AsynchronousCompletionTask、CompletionService、CompletionService;其實這四個接口內容不算多就是概念型的,當然他們并不是用不到的。
1. Callable實現Callable接口的類其實就是一個可以返回結果的任務,并且可以拋出異常。 通過ExecutorService.submit 方法提交一個callable任務,并且通過Future對象來獲得結果。 Future對象可以取消運行任務,設置等待時間,獲取任務狀態,最終獲得任務結果。Callable類似于 Runnable,但是runnable并不會有返回結果和異常信息。這一點我們需要區別開。
2. AsynchronousCompletionTask一個標記接口識別異步任務的異步方法。他可以提供監控,調試和跟蹤異步活動。
3. CompletionServiceExecutorService的擴展,可以獲得線程執行結果。
代碼示例:
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(); } }4. CompletionStage
異步計算中可能出現的一個階段,也就是說當一個CompletionStage 完成時執行的動作或計算。
其實拆開來看就是,一個階段的執行可能會觸發完成一個單一的階段,或兩個階段,或多個階段。在一個階段的依賴關系被安排使用的方法與前綴。由兩個階段完成所觸發的,可以結合他們的結果或效果,使用相應命名的方法。由兩個階段所觸發的,沒有保證的結果用于依賴階段的計算。這個類呢可以說讓人很難取舍到底什么時候用,什么時候需要做幾個階段的處理計算。這個其實根據大家的業務考慮使用與否,畢竟他只是一個工具,即使有相同業務也可以使用別的方式實現。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/65028.html
摘要:針對高質量多線程并發程序設計時為防死崩等現象的出現,比如使用之前的和等,每每需要考慮性能死鎖公平性資源管理以及如何避免線程安全性方面帶來的危害等諸多因素,往往會采用一些較為復雜的安全策略,加重了程序員的開發負擔。 大家好,最近由于公司的事情不是很多,準備開篇寫一寫concurrent這一塊,因為最近好多面試者對這個都不是很了解,有的是知其然不知其所以然,我寫這篇(系列)文章的初衷是為了...
摘要:并發和并行并發和并行是兩個非常容易被混淆的概念。并發說的是在一個時間段內,多件事情在這個時間段內交替執行。并行說的是多件事情在同一個時刻同事發生。由于線程池是一個線程,得不到執行,而被餓死,最終導致了程序死鎖的現象。 同步(Synchronous)和異步(Asynchronous) 同步和異步通常來形容一次方法調用,同步方法調用一旦開始,調用者必須等到方法調用返回后,才能繼續后續的行為...
摘要:所有示例代碼請見下載于基本概念并發同時擁有兩個或者多個線程,如果程序在單核處理器上運行多個線程將交替地換入或者換出內存這些線程是同時存在的,每個線程都處于執行過程中的某個狀態,如果運行在多核處理器上此時,程序中的每個線程都 所有示例代碼,請見/下載于 https://github.com/Wasabi1234... showImg(https://upload-images.jians...
摘要:有三種狀態運行關閉終止。類類,提供了一系列工廠方法用于創建線程池,返回的線程池都實現了接口。線程池的大小一旦達到最大值就會保持不變,在提交新任務,任務將會進入等待隊列中等待。此線程池支持定時以及周期性執行任務的需求。 這是java高并發系列第19篇文章。 本文主要內容 介紹Executor框架相關內容 介紹Executor 介紹ExecutorService 介紹線程池ThreadP...
閱讀 666·2021-11-15 11:37
閱讀 4105·2021-09-09 09:34
閱讀 3559·2019-08-30 15:52
閱讀 2602·2019-08-29 14:03
閱讀 2842·2019-08-26 13:36
閱讀 1587·2019-08-26 12:16
閱讀 1592·2019-08-26 11:45
閱讀 3488·2019-08-23 18:41