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