Java多線程詳解(二)--Runnable和Callable

Java多線程實(shí)現(xiàn)方式主要有四種:繼承Thread類(lèi)灯抛、實(shí)現(xiàn)Runnable接口坑赡、實(shí)現(xiàn)Callable接口通過(guò)FutureTask包裝器來(lái)創(chuàng)建Thread線程嫉鲸、使用ExecutorService为牍、Callable馅精、Future實(shí)現(xiàn)有返回結(jié)果的多線程次慢。
其中前兩種方式線程執(zhí)行完后都沒(méi)有返回值旁涤,后兩種是帶返回值的。

Runnable和Callable的區(qū)別

Runnable接口

@FunctionalInterface
public interface Runnable {
    /**
     * When an object implementing interface <code>Runnable</code> is used
     * to create a thread, starting the thread causes the object's
     * <code>run</code> method to be called in that separately executing
     * thread.
     * <p>
     * The general contract of the method <code>run</code> is that it may
     * take any action whatsoever.
     *
     * @see     java.lang.Thread#run()
     */
    public abstract void run();
}

Callable接口

@FunctionalInterface
public interface Callable<V> {
    /**
     * Computes a result, or throws an exception if unable to do so.
     *
     * @return computed result
     * @throws Exception if unable to compute a result
     */
    V call() throws Exception;
}

Runnable和Callable的區(qū)別

1.Runnable執(zhí)行方法是run(),Callable是call()
2.實(shí)現(xiàn)Runnable接口的任務(wù)線程無(wú)返回值迫像;實(shí)現(xiàn)Callable接口的任務(wù)線程能返回執(zhí)行結(jié)果
3.call方法可以拋出異常劈愚,run方法若有異常只能在內(nèi)部消化

注意
Callable接口支持返回執(zhí)行結(jié)果,需要調(diào)用FutureTask.get()方法實(shí)現(xiàn)闻妓,此方法會(huì)阻塞主線程直到獲取結(jié)果菌羽;當(dāng)不調(diào)用此方法時(shí),主線程不會(huì)阻塞由缆!
如果線程出現(xiàn)異常注祖,F(xiàn)uture.get()會(huì)拋出throws InterruptedException或者ExecutionException;如果線程已經(jīng)取消均唉,會(huì)爬出CancellationException

Callable示例

package com.keda.activiti.config;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

/**
 * @program: xxx
 * @description:
 * @author: shuonar
 * @create: 2020-06-02 16:52
 **/
public class ExecutorsTest {
    public static void main(String[] args) {
        ExecutorService executorService = Executors.newFixedThreadPool(2);

        Callable<String> callable = new Callable<String>() {
            @Override
            public String call() throws Exception {
                Thread.sleep(3000);
                System.out.println("Thread_current="+Thread.currentThread());

                return "Hello World!";
            }
        };

        System.out.println("start thread ....");
        Future<String> future =  executorService.submit(callable);
        try {
            System.out.println("future.get()=" + future.get());
        }catch (Exception e){
            e.printStackTrace();
        }

        System.out.println("end thread...");
        // 切記:關(guān)閉線程池
        executorService.shutdown();
    }
}

start thread ....
Thread_current=Thread[pool-1-thread-1,5,main]
future.get()=Hello World!
end thread...

其它

在程序開(kāi)發(fā)中只要是多線程肯定永遠(yuǎn)以實(shí)現(xiàn)Runnable接口為主是晨,因?yàn)閷?shí)現(xiàn)Runnable接口相比繼承Thread類(lèi)有如下好處:
1.避免點(diǎn)繼承的局限,一個(gè)類(lèi)可以實(shí)現(xiàn)多個(gè)接口
2.資源共享

Runnable接口和Thread之間的聯(lián)系

public class Thread extends Object implements Runnable

由此可見(jiàn):Thread類(lèi)也是Runnable接口的子類(lèi)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末舔箭,一起剝皮案震驚了整個(gè)濱河市罩缴,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌层扶,老刑警劉巖箫章,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異镜会,居然都是意外死亡檬寂,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)戳表,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)焰薄,“玉大人,你說(shuō)我怎么就攤上這事扒袖。” “怎么了亩码?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵季率,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我描沟,道長(zhǎng)飒泻,這世上最難降的妖魔是什么鞭光? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮泞遗,結(jié)果婚禮上惰许,老公的妹妹穿的比我還像新娘。我一直安慰自己史辙,他們只是感情好汹买,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著聊倔,像睡著了一般晦毙。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上耙蔑,一...
    開(kāi)封第一講書(shū)人閱讀 51,541評(píng)論 1 305
  • 那天见妒,我揣著相機(jī)與錄音,去河邊找鬼甸陌。 笑死须揣,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的钱豁。 我是一名探鬼主播耻卡,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼寥院!你這毒婦竟也來(lái)了劲赠?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤秸谢,失蹤者是張志新(化名)和其女友劉穎凛澎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體估蹄,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡塑煎,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了臭蚁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片最铁。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖垮兑,靈堂內(nèi)的尸體忽然破棺而出冷尉,到底是詐尸還是另有隱情,我是刑警寧澤系枪,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布雀哨,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏雾棺。R本人自食惡果不足惜膊夹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望捌浩。 院中可真熱鬧放刨,春花似錦、人聲如沸尸饺。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)侵佃。三九已至麻昼,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間馋辈,已是汗流浹背抚芦。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留迈螟,地道東北人叉抡。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像答毫,于是被迫代替她去往敵國(guó)和親褥民。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355