Runnable卑吭、Callable马绝、Future、FutureTask

Runnable富稻、Callable、Future抚岗、FutureTask

一:并發(fā)編程的核心

并發(fā)編程的核心問題:分工哪怔、同步和互斥向抢。
要編寫高質(zhì)量的并發(fā)程序胚委,只需要處理好分工、同步和互斥的問題即可篷扩,同步和互斥對(duì)應(yīng)的就是管程模型

二:Runnable枢冤、Callable铜秆、Future淹真、FutureTask

1:Runnable连茧、Callable、Future客扎、FutureTask的UML類圖

Callable與Runnable罚斗、Future、FutureTask無繼承關(guān)系针姿。
FutureTask帶了Future和Runnable的功能。


Runnable....png

2:Runnable和Callable

// JDK1.0 不接受參數(shù)绞绒、無返回值榕暇,單線程、線程池均可使用彤枢。
public interface Runnable {

  public abstract void run();
  
}

// JDK 1.5 不接受參數(shù)、有返回值,僅供線程池使用龄砰。
public interface Callable<V> {

  V call() throws Exception;

}

3:Future API

// 取消任務(wù)
boolean cancel( boolean mayInterruptIfRunning);

// 判斷任務(wù)是否已取消
boolean isCancelled();

// 判斷任務(wù)是否已結(jié)束
boolean isDone();

// 獲得任務(wù)執(zhí)行結(jié)果 ---> 阻塞方法
get();

// 獲得任務(wù)執(zhí)行結(jié)果,支持超時(shí) ---> 阻塞方法
get(long timeout, TimeUnit unit);

4:為什么要引入FutureTask式镐?為什么要讓FutureTask實(shí)現(xiàn)Runnable?

在單線程和多線程執(zhí)行Task的時(shí)候歹茶,都有獲取執(zhí)行結(jié)果的需求你弦,但是當(dāng)使用Runnable的時(shí)候,Runnable的API是拿不到返回值的禽作,因此可以用FutureTask類包裝Runnable來拿返回值。
所以:Runnable旷偿、Callable、Future幢妄、FutureTask存在的目的是為了使用更加靈活茫负。

獲取執(zhí)行結(jié)果:

  • 單線程:FutureTask包裝Callable和Runnable,通過FutureTask獲取返回值朽褪。
  • 多線程:?jiǎn)为?dú)使用Callable能獲取返回值,F(xiàn)utureTask包裝Callable和Runnable能獲取返回值衍锚。

5:使用示例

/**
 * <p>
 * Runnable嗤堰、Callable、Future踢匣、FutureTask
 * </p>
 *
 * @author: Sunny
 * @date: 2021/2/1
 * @version: v1.0.0
 */
public class TaskTest {

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        // 1:?jiǎn)尉€程 + Callable + FutureTask拿到返回結(jié)果
        FutureTask<Integer> task = new FutureTask<Integer>(() -> {
            return 1 + 1;
        });
        Thread t1 = new Thread(task);
        t1.start();
        System.out.println(task.get());

        // 2:?jiǎn)尉€程 + Runnable + T result + FutureTask拿到返回結(jié)果
        Account account = new Account();
        FutureTask<Account> task1 = new FutureTask<Account>(() -> {
            account.setName("zhangsan");
            account.setAge(3);
        }, account);
        Thread t2 = new Thread(task1);
        t2.start();
        System.out.println(task1.get().getName() + " : " + task1.get().getAge());
        System.out.println(account.getName() + " : " + account.getAge());

        // 3:線程池 + Callable + Future拿到返回結(jié)果
        ExecutorService service = Executors.newSingleThreadExecutor();
        Future<Integer> future = service.submit(() -> 1 + 1);
        System.out.println(future.get());

        // 4:線程池 + Runnable + Future拿不到返回結(jié)果
        Future<?> future1 = service.submit(() -> System.out.println(1));
        // Runnable 不接受返回值离唬,因此其值為null
        System.out.println(future1.get());

        // 5:線程池 + Runnable +  T result + Future拿到返回結(jié)果
        Account account1 = new Account();
        Future<Account> future2 = service.submit(() -> {
            account1.setName("xiaoming");
            account1.setAge(4);
        }, account1);
        System.out.println(future2.get().getName() + " : " + future2.get().getAge());
        System.out.println(account1.getName() + " : " + account1.getAge());
        service.shutdown();
    }

    @Data
    public static class Account {
        private String name;
        private Integer age;
    }

}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末输莺,一起剝皮案震驚了整個(gè)濱河市裸诽,隨后出現(xiàn)的幾起案子型凳,更是在濱河造成了極大的恐慌丈冬,老刑警劉巖甘畅,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件疏唾,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡荸实,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門泄朴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來露氮,“玉大人,你說我怎么就攤上這事畔规。” “怎么了三妈?”我有些...
    開封第一講書人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵莫绣,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我对室,道長(zhǎng),這世上最難降的妖魔是什么蔫骂? 我笑而不...
    開封第一講書人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任牺汤,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘固该。我一直安慰自己糖儡,他們只是感情好怔匣,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著每瞒,像睡著了一般。 火紅的嫁衣襯著肌膚如雪代芜。 梳的紋絲不亂的頭發(fā)上浓利,一...
    開封第一講書人閱讀 51,443評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音贷掖,去河邊找鬼。 笑死昆咽,一個(gè)胖子當(dāng)著我的面吹牛牙甫,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播窟哺,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼糕殉!你這毒婦竟也來了殖告?” 一聲冷哼從身側(cè)響起阿蝶,我...
    開封第一講書人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤羡洁,失蹤者是張志新(化名)和其女友劉穎爽丹,沒想到半個(gè)月后辛蚊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡袋马,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年虑凛,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了软啼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片桑谍。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡锣披,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出雹仿,到底是詐尸還是另有隱情整以,我是刑警寧澤,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布悄蕾,位于F島的核電站,受9級(jí)特大地震影響奠骄,放射性物質(zhì)發(fā)生泄漏番刊。R本人自食惡果不足惜含鳞,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一蝉绷、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧枣抱,春花似錦、人聲如沸佳晶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至漩符,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間嗜暴,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留狐赡,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓颖侄,卻偏偏與公主長(zhǎng)得像享郊,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子炊琉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354

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