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