多線程實(shí)現(xiàn)的三個(gè)方法

一. 實(shí)現(xiàn) Runnable 接口敌买,并實(shí)現(xiàn)該接口的 run() 方法媒殉。

主要步驟:

  1. 自定義類并實(shí)現(xiàn) Runnable 接口什黑,實(shí)現(xiàn) run() 方法碧库。
  2. 創(chuàng)建 Thread 對(duì)象盅粪,用實(shí)現(xiàn) Runnable 接口的對(duì)象作為參數(shù)實(shí)例化該 Thread 對(duì)象钓葫。
  3. 調(diào)用 Thread 的 start 方法。
class MyThread implements Runnable {
     // create my own Thread class
    public void run() {
        System.out.println("Thread body");
    }

}

public class Test {
    public static void main(String[] args) {
        MyThread thread = new MyThread();
        Thread t = new Thread(thread);
        t.start(); //start the thread
    }
}

二. 繼承 Thread 類票顾,重寫(xiě) run 方法瓤逼。

Thread是實(shí)現(xiàn)了 Runnable 接口的一個(gè)實(shí)例,它代表了一個(gè)線程的實(shí)例库物,并且啟動(dòng)線程的唯一方法就是通過(guò) Thread 類的 start()方法霸旗。start()方法是一個(gè) native(本地)方法,它將啟動(dòng)一個(gè)新線程戚揭,并執(zhí)行 run()方法(Thread 中提供的 run()方法是一個(gè)空方法)诱告。注意,當(dāng) start()方法調(diào)用后并不是立即執(zhí)行多線程代碼民晒,而是使該線程變?yōu)榭蛇\(yùn)行態(tài)(Runnable),什么時(shí)候運(yùn)行多線程代碼是由操作系統(tǒng)決定的精居。

class MyThreadB extends Thread {
    public void run() {
        System.out.println("Thread body");
    }
}

public class Test {

    public static void main(String[] args) {
      MyThreadB thread = new MyThreadB();
      thread.start();
    }
}

三. 實(shí)現(xiàn) Callable接口,重寫(xiě) call()方法潜必。

靴姿。
Callable 對(duì)象實(shí)際屬于 Executor 框架中的功能類,Callable 接口與 Runnable 接口類似磁滚,但提供了更強(qiáng)大的功能佛吓,包括以下三點(diǎn):**

  • Callable 可以在任務(wù)結(jié)束后提供一個(gè)返回值,Runnable無(wú)法提供此功能垂攘。
  • Callable中的 call()方法可以拋出異常维雇,而 Runnable的 run()方法不能拋異常。
  • 運(yùn)行 Callable 可以拿到一個(gè) Future 對(duì)象晒他,F(xiàn)uture 對(duì)象表示異步計(jì)算的結(jié)果吱型。它提供了檢查計(jì)算是否完成的方法。由于線程屬于異步計(jì)算模型陨仅,所以無(wú)法從其他線程中得到方法的返回值津滞,在這種情況下铝侵,就可以使用 Future 來(lái)監(jiān)視目標(biāo)線程調(diào)用 call()方法的情況,當(dāng)調(diào)用 Future 的 get()方法以獲取結(jié)果時(shí)触徐,當(dāng)前線程就會(huì)阻塞咪鲜,直到 call()方法結(jié)束返回結(jié)果。
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

/**
 * Created by qd on 12/5/17.
 */

public class CallableAndFuture {

    public static class CallableTest implements Callable<String> {
        public String call() throws Exception {
            return "Hello World!";
        }
    }

    public static void main(String[] args) {
        ExecutorService threadPool = Executors.newSingleThreadExecutor();

        Future<String> future = threadPool.submit(new CallableTest());
        try {
            System.out.println("waiting thread to finish");
            System.out.println(future.get()); //等待線程結(jié)束,并獲取返回結(jié)果
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

當(dāng)需要實(shí)現(xiàn)多線程的時(shí)候锌介,一般推薦實(shí)現(xiàn) Runnable 接口的方式,原因如下:首先猾警,Thread 類定義了多種方法可以被派生類使用或重寫(xiě)孔祸,但是只有 run 方法是必須被重寫(xiě)的,在 run 方法中實(shí)現(xiàn)這個(gè)線程的主要功能发皿。這當(dāng)然是實(shí)現(xiàn) Runnable 接口所需的同樣的方法崔慧。而且,很多 java 開(kāi)發(fā)人員認(rèn)為穴墅,一個(gè) 類僅在它們需要被加強(qiáng)或被修改時(shí)才會(huì)被繼承惶室。因此,如果沒(méi)有必要重新 Thread 類的其他方法玄货,那么通過(guò)繼承 Thread 的實(shí)現(xiàn)方式與實(shí)現(xiàn) Runnable 接口的效果相同皇钞,在這種情況下最好通過(guò)實(shí)現(xiàn) Runnable 接口的方式來(lái)創(chuàng)建線程。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末松捉,一起剝皮案震驚了整個(gè)濱河市夹界,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌隘世,老刑警劉巖可柿,帶你破解...
    沈念sama閱讀 210,978評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異丙者,居然都是意外死亡复斥,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門(mén)械媒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)目锭,“玉大人,你說(shuō)我怎么就攤上這事纷捞÷录” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,623評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵兰绣,是天一觀的道長(zhǎng)世分。 經(jīng)常有香客問(wèn)我,道長(zhǎng)缀辩,這世上最難降的妖魔是什么臭埋? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,324評(píng)論 1 282
  • 正文 為了忘掉前任踪央,我火速辦了婚禮,結(jié)果婚禮上瓢阴,老公的妹妹穿的比我還像新娘畅蹂。我一直安慰自己,他們只是感情好荣恐,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布液斜。 她就那樣靜靜地躺著,像睡著了一般叠穆。 火紅的嫁衣襯著肌膚如雪少漆。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,741評(píng)論 1 289
  • 那天硼被,我揣著相機(jī)與錄音示损,去河邊找鬼。 笑死嚷硫,一個(gè)胖子當(dāng)著我的面吹牛检访,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播仔掸,決...
    沈念sama閱讀 38,892評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼脆贵,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了起暮?” 一聲冷哼從身側(cè)響起丹禀,我...
    開(kāi)封第一講書(shū)人閱讀 37,655評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎鞋怀,沒(méi)想到半個(gè)月后双泪,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,104評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡密似,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年焙矛,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片残腌。...
    茶點(diǎn)故事閱讀 38,569評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡村斟,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出抛猫,到底是詐尸還是另有隱情蟆盹,我是刑警寧澤,帶...
    沈念sama閱讀 34,254評(píng)論 4 328
  • 正文 年R本政府宣布闺金,位于F島的核電站逾滥,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏败匹。R本人自食惡果不足惜寨昙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評(píng)論 3 312
  • 文/蒙蒙 一讥巡、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧舔哪,春花似錦欢顷、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,725評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至缆巧,卻和暖如春布持,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背盅蝗。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,950評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工鳖链, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留姆蘸,地道東北人墩莫。 一個(gè)月前我還...
    沈念sama閱讀 46,260評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像逞敷,于是被迫代替她去往敵國(guó)和親狂秦。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評(píng)論 2 348

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