免费A级毛片无码专区网站-成人国产精品视频一区二区-啊 日出水了 用力乖乖在线-国产黑色丝袜在线观看下-天天操美女夜夜操美女-日韩网站在线观看中文字幕-AV高清hd片XXX国产-亚洲av中文字字幕乱码综合-搬开女人下面使劲插视频

Future詳解

Future模式【1】Future模式是多線程開發(fā)中常見的設(shè)計(jì)模式,它的核心思想是異步調(diào)用 。對于Future模式來說,它無法立即返回你需要的數(shù)據(jù),但是它會返回一個(gè)契約,將來你可以憑借這個(gè)契約去獲取你需要的信息 。
【2】通俗一點(diǎn)就是生產(chǎn)者-消費(fèi)者模型的擴(kuò)展 。經(jīng)典“生產(chǎn)者-消費(fèi)者”模型中消息的生產(chǎn)者不關(guān)心消費(fèi)者何時(shí)處理完該條消息,也不關(guān)心處理結(jié)果 。Future模式則可以讓消息的生產(chǎn)者等待直到消息處理結(jié)束,如果需要的話還可以取得處理結(jié)果 。
java中是如何實(shí)現(xiàn)Future模式【1】直接繼承Thread或者實(shí)現(xiàn)Runnable接口都可以創(chuàng)建線程,但是這兩種方法都有一個(gè)問題 就是:沒有返回值,也就是不能獲取執(zhí)行完的結(jié)果 。
【2】因此java1.5就提供了Callable接口來實(shí)現(xiàn)這一場景,而Future和FutureTask就可以和Callable接口配合起來使用 ?!緩亩_(dá)到Future模式的效果】
Callable和Runnable的區(qū)別【1】源碼展示
@FunctionalInterfacepublic interface Callable<V> {V call() throws Exception;}@FunctionalInterfacepublic interface Runnable {public abstract void run();}【2】分析說明
Runnable 的缺陷:1.不能返回一個(gè)返回值2.不能拋出 checked Exception 。Callable的call方法可以有返回值,可以聲明拋出異常 。【3】疑問解析
1)為什么需要 Callable?
Callable 配合 Future 類 可以了解任務(wù)執(zhí)行情況,或者取消任務(wù)的執(zhí)行,還可獲取任務(wù)執(zhí)行的結(jié)果,這些功能都是 Runnable 做不到的,因?yàn)樗鼪]有返回值,不能拋出異常 。
了解Future接口【1】介紹 :Future就是對于具體的Runnable或者Callable任務(wù)的執(zhí)行結(jié)果進(jìn)行取消、查詢是否完成、獲取結(jié)果 。必要時(shí)可以通過get方法獲取執(zhí)行結(jié)果,該方法會阻塞直到任務(wù)返回結(jié)果 。
【2】源碼展示
public interface Future<V> {// 取消任務(wù)的執(zhí)行 。參數(shù)指定是否立即中斷任務(wù)執(zhí)行,或者等等任務(wù)結(jié)束boolean cancel(boolean mayInterruptIfRunning);//任務(wù)是否已經(jīng)取消,任務(wù)正常完成前將其取消,則返回trueboolean isCancelled();//需要注意的是如果任務(wù)正常終止、異?;蛉∠?,都將返回trueboolean isDone();//取得返回對象V get() throws InterruptedException, ExecutionException;//取得返回對像,允許等待設(shè)置的時(shí)間范圍V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException;}了解FutureTask類(Future接口的實(shí)現(xiàn)類)【1】介紹說明
1)該對象相當(dāng)于是消費(fèi)者和生產(chǎn)者的橋梁,消費(fèi)者通過FutureTask存儲任務(wù)的處理結(jié)果,更新任務(wù)的狀態(tài):未開始、正在處理、已完成等 。而生產(chǎn)者拿到的 FutureTask被轉(zhuǎn)型為Future接口,可以阻塞式獲取任務(wù)的處理結(jié)果,非阻塞式獲取任務(wù)處理狀態(tài) 。
2)FutureTask既可以被當(dāng)做Runnable來執(zhí)行,也可以被當(dāng)做Future來獲取Callable的返回結(jié)果 。
【2】代碼展示
0)繼承關(guān)系
public class FutureTask<V> implements RunnableFuture<V> public interface RunnableFuture<V> extends Runnable, Future<V>1)屬性值
// 表示當(dāng)前任務(wù)的狀態(tài)private volatile int state;// 表示當(dāng)前任務(wù)的狀態(tài)是新創(chuàng)建的,尚未執(zhí)行private static final int NEW= 0;// 表示當(dāng)前任務(wù)即將結(jié)束,還未完全結(jié)束,值還未寫,一種臨界狀態(tài)private static final int COMPLETING= 1;// 表示當(dāng)前任務(wù)正常結(jié)束private static final int NORMAL= 2;// 表示當(dāng)前任務(wù)執(zhí)行過程中出現(xiàn)了異常,內(nèi)部封裝的callable.call()向上拋出異常了private static final int EXCEPTIONAL= 3;// 表示當(dāng)前任務(wù)被取消private static final int CANCELLED= 4;// 表示當(dāng)前任務(wù)中斷中private static final int INTERRUPTING = 5;// 表示當(dāng)前任務(wù)已中斷private static final int INTERRUPTED= 6;// 我們在使用FutureTask對象的時(shí)候,會傳入一個(gè)Callable實(shí)現(xiàn)類或Runnable實(shí)現(xiàn)類,這個(gè)callable存儲的就是// 傳入的Callable實(shí)現(xiàn)類或Runnable實(shí)現(xiàn)類(Runnable會被使用修飾者設(shè)計(jì)模式偽裝為)private Callable<V> callable;// 正常情況下,outcome保存的是任務(wù)的返回結(jié)果// 不正常情況下,outcome保存的是任務(wù)拋出的異常private Object outcome; // 保存的是當(dāng)前任務(wù)執(zhí)行期間,執(zhí)行任務(wù)的線程的引用private volatile Thread runner;// 因?yàn)闀泻芏嗑€程去get結(jié)果,這里把線程封裝成WaitNode,一種數(shù)據(jù)結(jié)構(gòu):棧,頭插頭取private volatile WaitNode waiters;static final class WaitNode {// 線程對象volatile Thread thread;// 下一個(gè)WaitNode結(jié)點(diǎn)volatile WaitNode next;WaitNode() { thread = Thread.currentThread(); }}

經(jīng)驗(yàn)總結(jié)擴(kuò)展閱讀