成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

Future 模式

el09xccxy / 3061人閱讀

摘要:模式一種異步計算模式,并支持返回計算結(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 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)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/64667.html

相關(guān)文章

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

    摘要:本文首發(fā)于一世流云的專欄一模式簡介模式是多線程設(shè)計模式中的一種常見模式,它的主要作用就是異步地執(zhí)行任務(wù),并在需要的時候獲取結(jié)果。二中的模式在多線程基礎(chǔ)之模式中,我們曾經(jīng)給出過模式的通用類關(guān)系圖。 showImg(https://segmentfault.com/img/bVbiwcx?w=1000&h=667); 本文首發(fā)于一世流云的專欄:https://segmentfault.co...

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

    摘要:一定義模式用來獲取線程的執(zhí)行結(jié)果。案例中的類就是參與者參與者接受請求,然后創(chuàng)建線程進行異步處理。參與者會立即返回以的形式。虛擬數(shù)據(jù)參與者是用來統(tǒng)一代表參與者與參與者。 一、定義 Future模式用來獲取線程的執(zhí)行結(jié)果。在Thread-Per-Message模式中,如果調(diào)用一個線程異步執(zhí)行任務(wù),沒有辦法獲取到返回值,就像:host.request(10,A);而Future模式送出請求后...

    tinyq 評論0 收藏0
  • 多線程設(shè)計模式 - 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)看著一件商品時可以提交表單,當訂單完成后就可以在家...

    edgardeng 評論0 收藏0
  • 批量Future模式

    摘要:批量在模式的講解中,說到模式是一種支持異步計算并可以返回計算結(jié)果,并在返回結(jié)果前可以阻塞調(diào)用者的線程對象模型。批量模式是在對模式的擴展。 批量 FutureTask 在Future模式的講解中,說到future模式是一種支持異步計算并可以返回計算結(jié)果,并在返回結(jié)果前可以阻塞調(diào)用者的線程對象模型。批量Future模式是在對Future模式的擴展。比如有,一批FutureTask,我要把這...

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

    摘要:模式類似于用戶提交商品訂單,下單成功以后后臺異步的執(zhí)行耗時的業(yè)務(wù)在包中接口是線程模式的實現(xiàn),可以來進行異步計算。 Future模式類似于用戶提交商品訂單,下單成功以后后臺異步的執(zhí)行耗時的業(yè)務(wù)在java.util.concurrent包中.Future接口是Java線程Future模式的實現(xiàn),可以來進行異步計算。 showImg(https://segmentfault.com/img/...

    lx1036 評論0 收藏0
  • java Callable與Future模式

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

    Mr_zhang 評論0 收藏0

發(fā)表評論

0條評論

el09xccxy

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<