創(chuàng)建線程的三種方式

java創(chuàng)建線程的三種方式:

繼承Thread類創(chuàng)建線程類
通過Runable接口創(chuàng)建線程類
通過Callable和FutureTask創(chuàng)建線程

  • 繼承Thread類

(1)定義Thread類的子類,并重寫該類的run方法衣迷,該run方法的方法體就代表了線程要完成的任務(wù)。因此把run()方法稱為執(zhí)行體。

(2)創(chuàng)建Thread子類的實例胶滋,即創(chuàng)建了線程對象八回。

(3)調(diào)用線程對象的start()方法來啟動該線程。

package com.nf147.Constroller;

public class FirstThreadTest extends Thread {
    int i = 0;
    //重寫run方法,run方法的方法體就是現(xiàn)場執(zhí)行體
    public void run() {
        for (; i < 100; i++) {
            System.out.println(getName() + "  " + i);
        }
    }
    public static void main(String[] args) {
        for (int i = 0; i < 100; i++) {
            System.out.println(Thread.currentThread().getName() + "  : " + i);
            if (i == 50) {
                new FirstThreadTest().start();//構(gòu)造子類對象并啟動線程
                new FirstThreadTest().start();
            }
        }
    }
}

2.創(chuàng)建Runnable方法

(1)定義runnable接口的實現(xiàn)類歌憨,并重寫該接口的run()方法,該run()方法的方法體同樣是該線程的線程執(zhí)行體墩衙。
(2)創(chuàng)建 Runnable實現(xiàn)類的實例务嫡,并依此實例作為Thread的target來創(chuàng)建Thread對象,該Thread對象才是真正的線程對象漆改。
(3)調(diào)用線程對象的start()方法來啟動該線程心铃。

package com.nf147.Constroller;
public class RunnableThreadTest implements Runnable{ //創(chuàng)建Runnable接口類
        private int i;
        public void run()
        {
            for(i = 0;i <100;i++)
            {
                System.out.println(Thread.currentThread().getName()+" "+i);
            }
        }
        public static void main(String[] args)
        {
            for(int i = 0;i < 100;i++)
            {
                System.out.println(Thread.currentThread().getName()+" "+i);
                if(i==20)
                {
                    RunnableThreadTest rtt = new RunnableThreadTest();//創(chuàng)建一個類對象
                    new Thread(rtt,"新線程1").start();//創(chuàng)建接口類對象并啟動
                    new Thread(rtt,"新線程2").start();
                }
            }
        }
}
  • 通過Callable和Future創(chuàng)建線程

(1)創(chuàng)建Callable接口的實現(xiàn)類,并實現(xiàn)call()方法挫剑,該call()方法將作為線程執(zhí)行體去扣,并且有返回值。
(2)創(chuàng)建Callable實現(xiàn)類的實例樊破,使用FutureTask類來包裝Callable對象愉棱,該FutureTask對象封裝了該Callable對象的call()方法的返回值。
(3)使用FutureTask對象作為Thread對象的target創(chuàng)建并啟動新線程哲戚。
(4)調(diào)用FutureTask對象的get()方法來獲得子線程執(zhí)行結(jié)束后的返回值

package com.nf147.Constroller;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

public class CallableThreadTest implements Callable<Integer> {
    public static void main(String[] args) {
        CallableThreadTest ctt = new CallableThreadTest();//創(chuàng)建接口類對象
        FutureTask<Integer> ft = new FutureTask<>(ctt);//由callable創(chuàng)建一個futureTask
        for (int i = 0; i < 100; i++) {
            System.out.println(Thread.currentThread().getName() + " 的循環(huán)變量i的值" + i);
            if (i == 20) {
                new Thread(ft, "有返回值的線程").start();//啟動線程
            }
        }
        try {
            System.out.println("子線程的返回值:" + ft.get());
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
    }
    @Override
    public Integer call() throws Exception {
        int i = 0;
        for (; i < 100; i++) {
            System.out.println(Thread.currentThread().getName() + " " + i);
        }
        return i;
    }
}

二奔滑、創(chuàng)建線程的三種方式的對比
采用實現(xiàn)Runnable、Callable接口的方式創(chuàng)見多線程時顺少,

  • 優(yōu)勢是:
    線程類只是實現(xiàn)了Runnable接口或Callable接口档押,還可以繼承其他類。
    在這種方式下祈纯,多個線程可以共享同一個target對象,所以非常適合多個相同線程來處理同一份資源的情況叼耙,從而可以將CPU腕窥、代碼和數(shù)據(jù)分開,形成清晰的模型筛婉,較好地體現(xiàn)了面向?qū)ο蟮乃枷搿?/li>
  • 劣勢是:
    編程稍微復(fù)雜簇爆,如果要訪問當前線程癞松,則必須使用Thread.currentThread()方法。

使用繼承Thread類的方式創(chuàng)建多線程時

  • 優(yōu)勢是:
    編寫簡單入蛆,如果需要訪問當前線程响蓉,則無需使用Thread.currentThread()方法,直接使用this即可獲得當前線程哨毁。

  • 劣勢是:
    線程類已經(jīng)繼承了Thread類枫甲,所以不能再繼承其他父類。

package com.nf147.Constroller;
public class FirstThreadTest extends Thread {
    int i = 0;
    //重寫run方法扼褪,run方法的方法體就是現(xiàn)場執(zhí)行體
public void run() {
        for (; i < 100; i++) {
            System.out.println(getName() + "  " + i);
        }
    }
    public static void main(String[] args) {
        for (int i = 0; i < 100; i++) {
            System.out.println(Thread.currentThread().getName() + "  : " + i);
            if (i == 50) {
                new FirstThreadTest().start();
                new FirstThreadTest().start();
            }
        }
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末想幻,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子话浇,更是在濱河造成了極大的恐慌脏毯,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件幔崖,死亡現(xiàn)場離奇詭異食店,居然都是意外死亡,警方通過查閱死者的電腦和手機赏寇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進店門吉嫩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蹋订,你說我怎么就攤上這事率挣。” “怎么了露戒?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵椒功,是天一觀的道長。 經(jīng)常有香客問我智什,道長动漾,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任荠锭,我火速辦了婚禮旱眯,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘证九。我一直安慰自己删豺,他們只是感情好,可當我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布愧怜。 她就那樣靜靜地躺著呀页,像睡著了一般。 火紅的嫁衣襯著肌膚如雪拥坛。 梳的紋絲不亂的頭發(fā)上蓬蝶,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天尘分,我揣著相機與錄音,去河邊找鬼丸氛。 笑死培愁,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的缓窜。 我是一名探鬼主播定续,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼雹洗!你這毒婦竟也來了香罐?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤时肿,失蹤者是張志新(化名)和其女友劉穎庇茫,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體螃成,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡旦签,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了寸宏。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宁炫。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖氮凝,靈堂內(nèi)的尸體忽然破棺而出羔巢,到底是詐尸還是另有隱情,我是刑警寧澤罩阵,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布竿秆,位于F島的核電站,受9級特大地震影響稿壁,放射性物質(zhì)發(fā)生泄漏幽钢。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一傅是、第九天 我趴在偏房一處隱蔽的房頂上張望匪燕。 院中可真熱鬧,春花似錦喧笔、人聲如沸帽驯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽尼变。三九已至,卻和暖如春梗劫,著一層夾襖步出監(jiān)牢的瞬間享甸,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工梳侨, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蛉威,地道東北人。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓走哺,卻偏偏與公主長得像蚯嫌,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子丙躏,可洞房花燭夜當晚...
    茶點故事閱讀 43,490評論 2 348