成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Future 模式

el09xccxy / 2992人閱讀

摘要:模式一種異步計(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 callable) {
        if (callable == null)
            throw new NullPointerException();
        this.callable = callable;
        this.state = NEW;       // ensure visibility of callable
}
調(diào)用get()方法獲取執(zhí)行結(jié)果方法
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 {
            Callable c = 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

相關(guān)文章

  • Java多線程進(jìn)階(四二)—— J.U.C之executors框架:Future模式

    摘要:本文首發(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...

    marek 評(píng)論0 收藏0
  • Java多線程基礎(chǔ)(十一)——Future模式

    摘要:一定義模式用來(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)求后...

    tinyq 評(píng)論0 收藏0
  • 多線程設(shè)計(jì)模式 - Future模式

    摘要:模式是多線程開(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)訂單完成后就可以在家...

    edgardeng 評(píng)論0 收藏0
  • 批量Future模式

    摘要:批量在模式的講解中,說(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,我要把這...

    remcarpediem 評(píng)論0 收藏0
  • 并發(fā)編程中級(jí)篇二----并行設(shè)計(jì)模式----Future模式

    摘要:模式類似于用戶提交商品訂單,下單成功以后后臺(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/...

    lx1036 評(píng)論0 收藏0
  • java Callable與Future模式

    摘要:然而,這兩種方式的缺點(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ū)...

    Mr_zhang 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<