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