摘要:然而,這兩種方式的缺點(diǎn)是在線程任務(wù)執(zhí)行結(jié)束后,無(wú)法獲取執(zhí)行結(jié)果。如果任務(wù)執(zhí)行結(jié)束,無(wú)論是正常結(jié)束或是中途取消還是發(fā)生異常,都返回。如果任務(wù)完成前被取消,則返回。參數(shù)表示是否中斷執(zhí)行中的線程。
在Java中,創(chuàng)建線程一般有兩種方式,一種是繼承Thread類(lèi),一種是實(shí)現(xiàn)Runnable接口。然而,這兩種方式的缺點(diǎn)是在線程任務(wù)執(zhí)行結(jié)束后,無(wú)法獲取執(zhí)行結(jié)果。我們一般只能采用共享變量或共享存儲(chǔ)區(qū)以及線程通信的方式實(shí)現(xiàn)獲得任務(wù)結(jié)果的目的。不過(guò),Java中,也提供了使用Callable和Future來(lái)實(shí)現(xiàn)獲取任務(wù)結(jié)果的操作。Callable用來(lái)執(zhí)行任務(wù),產(chǎn)生結(jié)果,而Future用來(lái)獲得結(jié)果。
Future常用方法:
V get() :獲取異步執(zhí)行的結(jié)果,如果沒(méi)有結(jié)果可用,此方法會(huì)阻塞直到異步計(jì)算完成。
V get(Long timeout , TimeUnit unit) :獲取異步執(zhí)行結(jié)果,如果沒(méi)有結(jié)果可用,此方法會(huì)阻塞,但是會(huì)有時(shí)間限制,如果阻塞時(shí)間超過(guò)設(shè)定的timeout時(shí)間,該方法將拋出異常。
boolean isDone() :如果任務(wù)執(zhí)行結(jié)束,無(wú)論是正常結(jié)束或是中途取消還是發(fā)生異常,都返回true。
boolean isCanceller() :如果任務(wù)完成前被取消,則返回true。
boolean cancel(boolean mayInterruptRunning) :如果任務(wù)還沒(méi)開(kāi)始,執(zhí)行cancel(...)方法將返回false;如果任務(wù)已經(jīng)啟動(dòng),執(zhí)行cancel(true)方法將以中斷執(zhí)行此任務(wù)線程的方式來(lái)試圖停止任務(wù),如果停止成功,返回true;當(dāng)任務(wù)已經(jīng)啟動(dòng),執(zhí)行cancel(false)方法將不會(huì)對(duì)正在執(zhí)行的任務(wù)線程產(chǎn)生影響(讓線程正常執(zhí)行到完成),此時(shí)返回false;當(dāng)任務(wù)已經(jīng)完成,執(zhí)行cancel(...)方法將返回false。mayInterruptRunning參數(shù)表示是否中斷執(zhí)行中的線程。
通過(guò)方法分析我們也知道實(shí)際上Future提供了3種功能:(1)能夠中斷執(zhí)行中的任務(wù)(2)判斷任務(wù)是否執(zhí)行完成(3)獲取任務(wù)執(zhí)行完成后額結(jié)果。
定義thread
public class CallThread implements Callable{ @Override public String call() throws InterruptedException { Thread.sleep(1000); return "callable and future"; } }
測(cè)試
@RequestMapping("test-call") public void testCall() { CallThread callThread = new CallThread(); ExecutorService executor = Executors.newCachedThreadPool(); Futuresubmit = executor.submit(callThread); try { String s = submit.get(); System.out.println("獲取結(jié)果:" + s); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/74740.html
摘要:本文首發(fā)于一世流云的專欄一模式簡(jiǎn)介模式是多線程設(shè)計(jì)模式中的一種常見(jiàn)模式,它的主要作用就是異步地執(zhí)行任務(wù),并在需要的時(shí)候獲取結(jié)果。二中的模式在多線程基礎(chǔ)之模式中,我們?cè)?jīng)給出過(guò)模式的通用類(lèi)關(guān)系圖。 showImg(https://segmentfault.com/img/bVbiwcx?w=1000&h=667); 本文首發(fā)于一世流云的專欄:https://segmentfault.co...
摘要:類(lèi)是一種有效的廣泛使用的以工作隊(duì)列為基礎(chǔ)的的線程池的正確實(shí)現(xiàn),無(wú)須嘗試編寫(xiě)自己的線程池這樣容易出錯(cuò)。是并發(fā)編程庫(kù)新添加的類(lèi)它提供的方法可以返回各線程的返回值與接口類(lèi)似于但是無(wú)法返回結(jié)果也無(wú)法返回異常。返回的結(jié)果可以被拿到。 package com.snda.sync.impl.test; import java.util.ArrayList; import java.util.con...
摘要:在這個(gè)示例中我們使用了一個(gè)單線程線程池的。在延遲消逝后,任務(wù)將會(huì)并發(fā)執(zhí)行。這是并發(fā)系列教程的第一部分。第一部分線程和執(zhí)行器第二部分同步和鎖第三部分原子操作和 Java 8 并發(fā)教程:線程和執(zhí)行器 原文:Java 8 Concurrency Tutorial: Threads and Executors 譯者:BlankKelly 來(lái)源:Java8并發(fā)教程:Threads和Execut...
摘要:聲明了幾種方法,其中有一個(gè)就是傳入聲明了對(duì)具體的或者任務(wù)執(zhí)行進(jìn)行取消查詢結(jié)果獲取等方法。事實(shí)上,是接口的一個(gè)唯一實(shí)現(xiàn)類(lèi)。使用示例第一種方式是使用繼承了的線程池中的方法,將直接提交創(chuàng)建。 創(chuàng)建線程的兩種方式 直接繼承 Thread 實(shí)現(xiàn) Runnable 接口 這兩種方式都有一個(gè)缺點(diǎn):在執(zhí)行完成任務(wù)之后,無(wú)法直接獲取到最后的執(zhí)行結(jié)果。如果需要獲取執(zhí)行結(jié)果,就必須通過(guò)共享變量或線程通...
摘要:類(lèi)提供了一些有用的方法在線程池中執(zhí)行內(nèi)的任務(wù)。在線程池提交任務(wù)后返回了一個(gè)對(duì)象,使用它可以知道任務(wù)的狀態(tài)和得到返回的執(zhí)行結(jié)果。 Callable和Future出現(xiàn)的原因 創(chuàng)建線程的2種方式,一種是直接繼承Thread,另外一種就是實(shí)現(xiàn)Runnable接口。 這2種方式都有一個(gè)缺陷就是:在執(zhí)行完任務(wù)之后無(wú)法獲取執(zhí)行結(jié)果。 如果需要獲取執(zhí)行結(jié)果,就必須通過(guò)共享變量或者使用線程通信的方式來(lái)達(dá)...
閱讀 736·2021-08-17 10:11
閱讀 1600·2019-08-30 11:15
閱讀 1025·2019-08-26 13:54
閱讀 3511·2019-08-26 11:47
閱讀 1224·2019-08-26 10:20
閱讀 2823·2019-08-23 18:35
閱讀 1219·2019-08-23 17:52
閱讀 1300·2019-08-23 16:19