摘要:模式一種異步計算模式,并支持返回計算結(jié)果,在調(diào)用獲取到計算結(jié)果前可以阻塞調(diào)用者線程設(shè)計原理是針對與模式的一種實現(xiàn)它除了支持特有的特點,還支持的一些操作,比如取消,打斷。
FutureTask
future模式:一種異步計算模式,并支持返回計算結(jié)果,在調(diào)用get()獲取到計算結(jié)果前可以阻塞調(diào)用者線程
FutureTask設(shè)計原理FutureTask是JDK針對與future模式的一種實現(xiàn),它除了支持future特有的特點,還支持task的一些操作,比如取消,打斷。
一個FutureTask就是一個任務(wù)的計算單元,是調(diào)度的最小單位,它的調(diào)度借助于JDK的Executor任務(wù)調(diào)度模型。需要開發(fā)人員創(chuàng)建好FutureTask對象后,并送入到Executor去等待調(diào)度
具體的執(zhí)行過程,像下面是一段FutureTask的偽碼描述
創(chuàng)建一個futureTask對象task 提交task到調(diào)度器executor等待調(diào)度 等待調(diào)度中... 如果此時currentThread調(diào)取執(zhí)行結(jié)果task.get(),會有幾種情況 if task 還沒有被executor調(diào)度或正在執(zhí)行中 阻塞當前線程,并加入到一個阻塞鏈表中waitNode else if task被其它Thread取消,并取消成功 或task處于打斷狀態(tài) throw exception else if task執(zhí)行完畢,返回執(zhí)行結(jié)果,或執(zhí)行存在異常,返回異常信息 如果此時有另外一個線程調(diào)用task.get() 執(zhí)行過程同上
注意:executor在執(zhí)行FutureTask前,會先判斷是否被取消,如果取消就不在執(zhí)行,但執(zhí)行后就不可以在取消了
FutureTask 核心部分代碼 在futureTask定義task的轉(zhuǎn)態(tài)有:private volatile int state; private static final int NEW = 0; // 創(chuàng)建 private static final int COMPLETING = 1; // 完成 private static final int NORMAL = 2; // private static final int EXCEPTIONAL = 3; // invoke task 出現(xiàn)異常 private static final int CANCELLED = 4; // cancel task private static final int INTERRUPTING = 5; // interrupting task private static final int INTERRUPTED = 6;創(chuàng)建一個FutureTask
創(chuàng)建futureTask只需要需要一個callable對象或runnable對象的參數(shù),并在創(chuàng)建時設(shè)置狀態(tài)為NEW
public FutureTask(Callable調(diào)用get()方法獲取執(zhí)行結(jié)果方法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 調(diào)度是執(zhí)行的方法
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); } }
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/64667.html
摘要:本文首發(fā)于一世流云的專欄一模式簡介模式是多線程設(shè)計模式中的一種常見模式,它的主要作用就是異步地執(zhí)行任務(wù),并在需要的時候獲取結(jié)果。二中的模式在多線程基礎(chǔ)之模式中,我們曾經(jīng)給出過模式的通用類關(guān)系圖。 showImg(https://segmentfault.com/img/bVbiwcx?w=1000&h=667); 本文首發(fā)于一世流云的專欄:https://segmentfault.co...
摘要:一定義模式用來獲取線程的執(zhí)行結(jié)果。案例中的類就是參與者參與者接受請求,然后創(chuàng)建線程進行異步處理。參與者會立即返回以的形式。虛擬數(shù)據(jù)參與者是用來統(tǒng)一代表參與者與參與者。 一、定義 Future模式用來獲取線程的執(zhí)行結(jié)果。在Thread-Per-Message模式中,如果調(diào)用一個線程異步執(zhí)行任務(wù),沒有辦法獲取到返回值,就像:host.request(10,A);而Future模式送出請求后...
摘要:模式是多線程開發(fā)中非常常見的一種設(shè)計模式,它的核心思想是異步調(diào)用。這類似我們?nèi)粘I钪械脑诰€購物流程,帶在購物網(wǎng)看著一件商品時可以提交表單,當訂單完成后就可以在家里等待商品送貨上門。內(nèi)部類已經(jīng)實現(xiàn)了模式,后續(xù)再講 Future模式是多線程開發(fā)中非常常見的一種設(shè)計模式,它的核心思想是異步調(diào)用。這類似我們?nèi)粘I钪械脑诰€購物流程,帶在購物網(wǎng)看著一件商品時可以提交表單,當訂單完成后就可以在家...
摘要:批量在模式的講解中,說到模式是一種支持異步計算并可以返回計算結(jié)果,并在返回結(jié)果前可以阻塞調(diào)用者的線程對象模型。批量模式是在對模式的擴展。 批量 FutureTask 在Future模式的講解中,說到future模式是一種支持異步計算并可以返回計算結(jié)果,并在返回結(jié)果前可以阻塞調(diào)用者的線程對象模型。批量Future模式是在對Future模式的擴展。比如有,一批FutureTask,我要把這...
摘要:模式類似于用戶提交商品訂單,下單成功以后后臺異步的執(zhí)行耗時的業(yè)務(wù)在包中接口是線程模式的實現(xiàn),可以來進行異步計算。 Future模式類似于用戶提交商品訂單,下單成功以后后臺異步的執(zhí)行耗時的業(yè)務(wù)在java.util.concurrent包中.Future接口是Java線程Future模式的實現(xiàn),可以來進行異步計算。 showImg(https://segmentfault.com/img/...
摘要:然而,這兩種方式的缺點是在線程任務(wù)執(zhí)行結(jié)束后,無法獲取執(zhí)行結(jié)果。如果任務(wù)執(zhí)行結(jié)束,無論是正常結(jié)束或是中途取消還是發(fā)生異常,都返回。如果任務(wù)完成前被取消,則返回。參數(shù)表示是否中斷執(zhí)行中的線程。 在Java中,創(chuàng)建線程一般有兩種方式,一種是繼承Thread類,一種是實現(xiàn)Runnable接口。然而,這兩種方式的缺點是在線程任務(wù)執(zhí)行結(jié)束后,無法獲取執(zhí)行結(jié)果。我們一般只能采用共享變量或共享存儲區(qū)...
閱讀 2224·2021-11-23 09:51
閱讀 2940·2021-11-22 15:35
閱讀 3037·2019-08-30 15:53
閱讀 1114·2019-08-30 14:04
閱讀 3351·2019-08-29 12:39
閱讀 1907·2019-08-28 17:57
閱讀 1211·2019-08-26 13:39
閱讀 638·2019-08-26 13:34