并發(fā)編程-Callable與Future模式

上一篇 <<<并發(fā)隊(duì)列
下一篇 >>>Fork/Join框架


Callable與Future模式:Callable用來(lái)執(zhí)行任務(wù),F(xiàn)uture用來(lái)獲得結(jié)果鹉胖。

底層的原理主要采用wait和notify

Future提供的功能

(1)能夠中斷執(zhí)行中的任務(wù)
(2)判斷任務(wù)是否執(zhí)行完成
(3)獲取任務(wù)執(zhí)行完成后的結(jié)果馋袜。

Future常用方法

V get() :獲取異步執(zhí)行的結(jié)果司浪,如果沒(méi)有結(jié)果可用荧关,此方法會(huì)阻塞直到異步計(jì)算完成省骂。
V get(Long timeout , TimeUnit unit) :獲取異步執(zhí)行結(jié)果举户,如果沒(méi)有結(jié)果可用尤仍,此方法會(huì)阻塞,但是會(huì)有時(shí)間限制蔼紧,如果阻塞時(shí)間超過(guò)設(shè)定的timeout時(shí)間婆硬,該方法將拋出異常。
boolean isDone() :如果任務(wù)執(zhí)行結(jié)束奸例,無(wú)論是正常結(jié)束或是中途取消還是發(fā)生異常彬犯,都返回true。
boolean isCanceller() :如果任務(wù)完成前被取消,則返回true躏嚎。
boolean cancel(boolean mayInterruptRunning) :如果任務(wù)還沒(méi)開(kāi)始,執(zhí)行cancel(...)方法將返回false菩貌;如果任務(wù)已經(jīng)啟動(dòng)卢佣,執(zhí)行cancel(true)方法將以中斷執(zhí)行此任務(wù)線程的方式來(lái)試圖停止任務(wù),如果停止成功箭阶,返回true虚茶;當(dāng)任務(wù)已經(jīng)啟動(dòng),執(zhí)行cancel(false)方法將不會(huì)對(duì)正在執(zhí)行的任務(wù)線程產(chǎn)生影響(讓線程正常執(zhí)行到完成)仇参,此時(shí)返回false嘹叫;當(dāng)任務(wù)已經(jīng)完成,執(zhí)行cancel(...)方法將返回false诈乒。mayInterruptRunning參數(shù)表示是否中斷執(zhí)行中的線程罩扇。

Callable的優(yōu)勢(shì)

a、有返回
b怕磨、主線程不用等待

核心代碼

ExecutorService executor = Executors.newCachedThreadPool();
Future<Integer> future = executor.submit(new AddNumberTask());
System.out.println(Thread.currentThread().getName() + "線程執(zhí)行其他任務(wù)");
Integer integer = future.get();
System.out.println(integer);
// 關(guān)閉線程池
if (executor != null) {
 executor.shutdown();
}

手寫(xiě)Callable與Future模式核心思路

public void run() {
    result = myCallable.call();
    // 喚醒阻塞線程
    LockSupport.unpark(curThread);
    // 也可以使用下列方式喚醒
    /*synchronized (lock) {
        lock.notify();
    }*/
}

/**
 * 結(jié)果返回
 * @return
 */
public V get() {
    // 獲取結(jié)果喂饥,則直接返回
    if (result != null) {
        return result;
    }
    // 獲得當(dāng)前線程
    curThread = Thread.currentThread();
    // 未獲得結(jié)果,則先阻塞肠鲫,等run方法執(zhí)行完成調(diào)用unpark后员帮,自動(dòng)繼續(xù)執(zhí)行
    LockSupport.park(curThread);
    // 也可以使用下列方式阻塞
    /*synchronized (lock) {
        try {
            lock.wait();
        } catch (Exception e) {

        }
    }*/
    return result;
}
MyTask<String> myTask = new MyTask<>(new MyCallableImpl());
new Thread(myTask).start();
String s = myTask.get();
System.out.println(s);

相關(guān)文章鏈接:
<<<多線程基礎(chǔ)
<<<線程安全與解決方案
<<<鎖的深入化
<<<鎖的優(yōu)化
<<<Java內(nèi)存模型(JMM)
<<<Volatile解決JMM的可見(jiàn)性問(wèn)題
<<<Volatile的偽共享和重排序
<<<CAS無(wú)鎖模式及ABA問(wèn)題
<<<Synchronized鎖
<<<Lock鎖
<<<AQS同步器
<<<Condition
<<<CountDownLatch同步計(jì)數(shù)器
<<<Semaphore信號(hào)量
<<<CyclicBarrier屏障
<<<線程池
<<<并發(fā)隊(duì)列
<<<Fork/Join框架
<<<Threadlocal
<<<Disruptor框架
<<<如何優(yōu)化多線程總結(jié)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市导饲,隨后出現(xiàn)的幾起案子捞高,更是在濱河造成了極大的恐慌,老刑警劉巖渣锦,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件硝岗,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡袋毙,警方通過(guò)查閱死者的電腦和手機(jī)辈讶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)娄猫,“玉大人贱除,你說(shuō)我怎么就攤上這事∠蹦纾” “怎么了月幌?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)悬蔽。 經(jīng)常有香客問(wèn)我扯躺,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任录语,我火速辦了婚禮倍啥,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘澎埠。我一直安慰自己虽缕,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布蒲稳。 她就那樣靜靜地躺著氮趋,像睡著了一般。 火紅的嫁衣襯著肌膚如雪江耀。 梳的紋絲不亂的頭發(fā)上剩胁,一...
    開(kāi)封第一講書(shū)人閱讀 49,772評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音祥国,去河邊找鬼昵观。 笑死,一個(gè)胖子當(dāng)著我的面吹牛舌稀,可吹牛的內(nèi)容都是我干的索昂。 我是一名探鬼主播,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼扩借,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼椒惨!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起潮罪,我...
    開(kāi)封第一講書(shū)人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤康谆,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后嫉到,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體沃暗,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年何恶,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了孽锥。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡细层,死狀恐怖惜辑,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情疫赎,我是刑警寧澤盛撑,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站捧搞,受9級(jí)特大地震影響抵卫,放射性物質(zhì)發(fā)生泄漏狮荔。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一介粘、第九天 我趴在偏房一處隱蔽的房頂上張望殖氏。 院中可真熱鬧,春花似錦姻采、人聲如沸雅采。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至纲堵,卻和暖如春巡雨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背席函。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工铐望, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人茂附。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓正蛙,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親营曼。 傳聞我的和親對(duì)象是個(gè)殘疾皇子乒验,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容