談?wù)?Callable 栖忠、 Future 、 Runnable 它們之間的淵源

談?wù)? Callable 贸街、 Future 庵寞、 Runnable 它們之間的淵源

Runnable 存在的缺陷

  • 不能在任務(wù)執(zhí)行完成后返回執(zhí)行結(jié)果。

  • 不能拋出檢查類異常薛匪,必須在run 方法中聲明 try catch 捕捉異常捐川。

    * @see     java.lang.Thread#run()
    */
    public abstract void run();
    

Callable 和 Runnable 的不同

  • 執(zhí)行線程任務(wù)請求的方法不同,callable 請求的是 call() 方法逸尖, runnable 請求的是run () 方法古沥。

        */
        public abstract void run();
        
        */
        V call() throws Exception;  
    
  • 從call() 方法的源碼中也可以看出 ,Callable 的任務(wù)執(zhí)行之后是有 泛型的V 返回值的, 而 **Runnable 任務(wù) run() 的方法簽名 是void ** 沒有返回值娇跟。

  • call() 方法簽名中聲明了可以拋出異常岩齿,run() 方法并未聲明,因而不能拋出異常苞俘。

Future 的作用是什么盹沈?

在執(zhí)行大型計算任務(wù)的時候,為了不因繁重的計算任務(wù)而長時間阻塞主線程的任務(wù)執(zhí)行吃谣,可以把計算任務(wù)放到子線程去執(zhí)行乞封,并通過 Future 去控制子線程的執(zhí)行過程,獲取計算結(jié)果岗憋,從而提高整體任務(wù)的執(zhí)行效率肃晚。(是異步任務(wù)執(zhí)行的思想)

Callable 和 Future 的關(guān)系

  • Future 可以在執(zhí)行Callable 任務(wù)之后,存儲 call() 方法執(zhí)行結(jié)果澜驮,并可通過 Future 的get() 方法獲取執(zhí)行的結(jié)果陷揪。
  • 可以通過 Future 的 isDone() 方法, 來檢測任務(wù)的執(zhí)行情況杂穷。
  • 可以通過 cancel() 方法悍缠,按照業(yè)務(wù)需求,比如耗時較長而超過了一定時間閾值取消任務(wù)的執(zhí)行耐量。

future 的主要方法

  • boolean cancel(boolean mayInterruptIfRunning);
  • boolean isCancelled();
  • boolean isDone();
  • V get() throws InterruptedException, ExecutionExcept
  • V get(long timeout, TimeUnit unit)throws InterruptedException, ExecutionException, TimeoutException;(推薦使用飞蚓,避免程序阻塞)
get() 方法獲取任務(wù)執(zhí)行結(jié)果

執(zhí)行可能出現(xiàn)的幾種場景

基礎(chǔ)復(fù)盤-Future .jpg
isDone() 方法 檢測任務(wù)是否執(zhí)行完成
  • true: 標(biāo)識任務(wù)執(zhí)行成功, 出現(xiàn)異常的情況依然標(biāo)識任務(wù)已經(jīng)執(zhí)行成功。
  • false: 標(biāo)識任務(wù)還未執(zhí)行完成廊蜒。
cancel() 方法 取消任務(wù)執(zhí)行
  • 任務(wù)還未開始執(zhí)行趴拧,調(diào)用cancel 方法溅漾,任務(wù)會被正常取消, cancel() 方法執(zhí)行返回true著榴。
  • 任務(wù)已經(jīng)被 取消或則已完成添履,調(diào)用cancel() 方法,返回false脑又。
  • 任務(wù)正在執(zhí)行情況下暮胧,調(diào)用了cancel() 方法,不會直接取消任務(wù)的執(zhí)行问麸, 會根據(jù) mayInterruptIfRunning 參數(shù)決定是否讓當(dāng)前正在執(zhí)行任務(wù)的線程響應(yīng)中斷信號往衷, 如果為true ,那么正在執(zhí)行任務(wù)的線程會收到一個中斷信號,處理中斷邏輯严卖,false 則表示不中斷當(dāng)前任務(wù)的執(zhí)行席舍, cancel 方法返回 false。

Future 產(chǎn)生新的線程了嗎哮笆?

Callable 和 Future 并不能產(chǎn)生新的線程来颤, 需要借助 Thread 或者線程池(ThreadPool) 才能執(zhí)行任務(wù)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末稠肘,一起剝皮案震驚了整個濱河市脚曾,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌启具,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,807評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件珊泳,死亡現(xiàn)場離奇詭異鲁冯,居然都是意外死亡,警方通過查閱死者的電腦和手機色查,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,284評論 3 399
  • 文/潘曉璐 我一進店門薯演,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人秧了,你說我怎么就攤上這事跨扮。” “怎么了验毡?”我有些...
    開封第一講書人閱讀 169,589評論 0 363
  • 文/不壞的土叔 我叫張陵衡创,是天一觀的道長。 經(jīng)常有香客問我晶通,道長璃氢,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,188評論 1 300
  • 正文 為了忘掉前任狮辽,我火速辦了婚禮一也,結(jié)果婚禮上巢寡,老公的妹妹穿的比我還像新娘。我一直安慰自己椰苟,他們只是感情好抑月,可當(dāng)我...
    茶點故事閱讀 69,185評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著舆蝴,像睡著了一般谦絮。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上须误,一...
    開封第一講書人閱讀 52,785評論 1 314
  • 那天挨稿,我揣著相機與錄音,去河邊找鬼京痢。 笑死奶甘,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的祭椰。 我是一名探鬼主播臭家,決...
    沈念sama閱讀 41,220評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼方淤!你這毒婦竟也來了钉赁?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,167評論 0 277
  • 序言:老撾萬榮一對情侶失蹤携茂,失蹤者是張志新(化名)和其女友劉穎你踩,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體讳苦,經(jīng)...
    沈念sama閱讀 46,698評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡带膜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,767評論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了鸳谜。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片膝藕。...
    茶點故事閱讀 40,912評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖咐扭,靈堂內(nèi)的尸體忽然破棺而出芭挽,到底是詐尸還是另有隱情,我是刑警寧澤蝗肪,帶...
    沈念sama閱讀 36,572評論 5 351
  • 正文 年R本政府宣布袜爪,位于F島的核電站,受9級特大地震影響穗慕,放射性物質(zhì)發(fā)生泄漏饿敲。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,254評論 3 336
  • 文/蒙蒙 一逛绵、第九天 我趴在偏房一處隱蔽的房頂上張望怀各。 院中可真熱鬧倔韭,春花似錦、人聲如沸瓢对。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,746評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽硕蛹。三九已至醇疼,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間法焰,已是汗流浹背秧荆。 一陣腳步聲響...
    開封第一講書人閱讀 33,859評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留埃仪,地道東北人乙濒。 一個月前我還...
    沈念sama閱讀 49,359評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像卵蛉,于是被迫代替她去往敵國和親颁股。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,922評論 2 361