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