摘要:模式一種異步計算模式,并支持返回計算結果,在調用獲取到計算結果前可以阻塞調用者線程設計原理是針對與模式的一種實現它除了支持特有的特點,還支持的一些操作,比如取消,打斷。
FutureTask
future模式:一種異步計算模式,并支持返回計算結果,在調用get()獲取到計算結果前可以阻塞調用者線程
FutureTask設計原理FutureTask是JDK針對與future模式的一種實現,它除了支持future特有的特點,還支持task的一些操作,比如取消,打斷。
一個FutureTask就是一個任務的計算單元,是調度的最小單位,它的調度借助于JDK的Executor任務調度模型。需要開發人員創建好FutureTask對象后,并送入到Executor去等待調度
具體的執行過程,像下面是一段FutureTask的偽碼描述
創建一個futureTask對象task 提交task到調度器executor等待調度 等待調度中... 如果此時currentThread調取執行結果task.get(),會有幾種情況 if task 還沒有被executor調度或正在執行中 阻塞當前線程,并加入到一個阻塞鏈表中waitNode else if task被其它Thread取消,并取消成功 或task處于打斷狀態 throw exception else if task執行完畢,返回執行結果,或執行存在異常,返回異常信息 如果此時有另外一個線程調用task.get() 執行過程同上
注意:executor在執行FutureTask前,會先判斷是否被取消,如果取消就不在執行,但執行后就不可以在取消了
FutureTask 核心部分代碼 在futureTask定義task的轉態有:private volatile int state; private static final int NEW = 0; // 創建 private static final int COMPLETING = 1; // 完成 private static final int NORMAL = 2; // private static final int EXCEPTIONAL = 3; // invoke task 出現異常 private static final int CANCELLED = 4; // cancel task private static final int INTERRUPTING = 5; // interrupting task private static final int INTERRUPTED = 6;創建一個FutureTask
創建futureTask只需要需要一個callable對象或runnable對象的參數,并在創建時設置狀態為NEW
public FutureTask(Callable調用get()方法獲取執行結果方法callable) { if (callable == null) throw new NullPointerException(); this.callable = callable; this.state = NEW; // ensure visibility of callable }
private int awaitDone(boolean timed, long nanos) throws InterruptedException { final long deadline = timed ? System.nanoTime() + nanos : 0L; WaitNode q = null; boolean queued = false; for (;;) { if (Thread.interrupted()) { removeWaiter(q); throw new InterruptedException(); } int s = state; if (s > COMPLETING) { if (q != null) q.thread = null; return s; } else if (s == COMPLETING) // cannot time out yet Thread.yield(); else if (q == null) q = new WaitNode(); else if (!queued) queued = UNSAFE.compareAndSwapObject(this, waitersOffset, q.next = waiters, q); else if (timed) { nanos = deadline - System.nanoTime(); if (nanos <= 0L) { removeWaiter(q); return state; } LockSupport.parkNanos(this, nanos); } else LockSupport.park(this); } }executor 調度是執行的方法
public void run() { if (state != NEW || !UNSAFE.compareAndSwapObject(this, runnerOffset, null, Thread.currentThread())) return; try { Callablec = callable; if (c != null && state == NEW) { V result; boolean ran; try { result = c.call(); ran = true; } catch (Throwable ex) { result = null; ran = false; setException(ex); } if (ran) set(result); } } finally { // runner must be non-null until state is settled to // prevent concurrent calls to run() runner = null; // state must be re-read after nulling runner to prevent // leaked interrupts int s = state; if (s >= INTERRUPTING) handlePossibleCancellationInterrupt(s); } }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/64667.html
摘要:本文首發于一世流云的專欄一模式簡介模式是多線程設計模式中的一種常見模式,它的主要作用就是異步地執行任務,并在需要的時候獲取結果。二中的模式在多線程基礎之模式中,我們曾經給出過模式的通用類關系圖。 showImg(https://segmentfault.com/img/bVbiwcx?w=1000&h=667); 本文首發于一世流云的專欄:https://segmentfault.co...
摘要:一定義模式用來獲取線程的執行結果。案例中的類就是參與者參與者接受請求,然后創建線程進行異步處理。參與者會立即返回以的形式。虛擬數據參與者是用來統一代表參與者與參與者。 一、定義 Future模式用來獲取線程的執行結果。在Thread-Per-Message模式中,如果調用一個線程異步執行任務,沒有辦法獲取到返回值,就像:host.request(10,A);而Future模式送出請求后...
摘要:模式是多線程開發中非常常見的一種設計模式,它的核心思想是異步調用。這類似我們日常生活中的在線購物流程,帶在購物網看著一件商品時可以提交表單,當訂單完成后就可以在家里等待商品送貨上門。內部類已經實現了模式,后續再講 Future模式是多線程開發中非常常見的一種設計模式,它的核心思想是異步調用。這類似我們日常生活中的在線購物流程,帶在購物網看著一件商品時可以提交表單,當訂單完成后就可以在家...
摘要:批量在模式的講解中,說到模式是一種支持異步計算并可以返回計算結果,并在返回結果前可以阻塞調用者的線程對象模型。批量模式是在對模式的擴展。 批量 FutureTask 在Future模式的講解中,說到future模式是一種支持異步計算并可以返回計算結果,并在返回結果前可以阻塞調用者的線程對象模型。批量Future模式是在對Future模式的擴展。比如有,一批FutureTask,我要把這...
摘要:模式類似于用戶提交商品訂單,下單成功以后后臺異步的執行耗時的業務在包中接口是線程模式的實現,可以來進行異步計算。 Future模式類似于用戶提交商品訂單,下單成功以后后臺異步的執行耗時的業務在java.util.concurrent包中.Future接口是Java線程Future模式的實現,可以來進行異步計算。 showImg(https://segmentfault.com/img/...
摘要:然而,這兩種方式的缺點是在線程任務執行結束后,無法獲取執行結果。如果任務執行結束,無論是正常結束或是中途取消還是發生異常,都返回。如果任務完成前被取消,則返回。參數表示是否中斷執行中的線程。 在Java中,創建線程一般有兩種方式,一種是繼承Thread類,一種是實現Runnable接口。然而,這兩種方式的缺點是在線程任務執行結束后,無法獲取執行結果。我們一般只能采用共享變量或共享存儲區...
閱讀 2096·2021-11-23 09:51
閱讀 2839·2021-11-22 15:35
閱讀 2937·2019-08-30 15:53
閱讀 1038·2019-08-30 14:04
閱讀 3276·2019-08-29 12:39
閱讀 1802·2019-08-28 17:57
閱讀 1086·2019-08-26 13:39
閱讀 551·2019-08-26 13:34