線程的創(chuàng)建和啟動方式

線程的創(chuàng)建和啟動方式

??Java使用Thread代表線程,所有的線程對象都必須是Thread類或其子類的實例。每條線程的作用是完成一條、定的任務(wù)锨能,實際上就是執(zhí)行一段程序流(一段順

序執(zhí)行的代碼)。Java使用run方法來封裝這樣一段程序流。

1. Thread類創(chuàng)建線程類

通過繼承Thread類來創(chuàng)建并啟動多線程的步驟如下:

  1. 定義Thread類的子類址遇,并重寫該類的run方法熄阻,該run方法的方法體就是代表了線程需要完成的任務(wù)。因此倔约,我們經(jīng)常把run方法稱為線程執(zhí)行體秃殉。

  2. 創(chuàng)建Thread子類的實例,即創(chuàng)建了線程對象跺株。

  3. 用線程對象的start方法來啟動該線程复濒。

下面程序示范了通過繼承Thread類來創(chuàng)建、并啟動多線程的程序乒省。

public class FirstThread extends Thread {

    private int i;

    //重寫run方法,run方法體就是線程執(zhí)行體

    @Override

    public void run() {

        for (; i < 100; i++) {

            //當線程類繼承Thread類時畦木,可以直接調(diào)用getName()方法來返回當前線程的名袖扛。

            //如果想獲取當前線程,直接使用this即可

            //Thread對象的getName()返回當前該線程的名字

            System.out.println(getName() + " " + i+i);

        }

    }

    public static void main(String[] args) {

        for (int i = 0; i < 100; i++) {

            //調(diào)用Thread的currentThread方法獲取當前線程

            System.out.println(Thread.currentThread().getName() + " " + i);

            if (i == 20) {

                //創(chuàng)建十籍、并啟動第一條線程

                new FirstThread().start();

                //創(chuàng)建蛆封、并啟動第二條線程

                new FirstThread().start();

            }

        }

    }

}

注意:使用繼承Thread類的方法來創(chuàng)建線程類,多條線程之間無法共享線程類的實例變量勾栗。

2. 實現(xiàn)Runnable接口創(chuàng)建線程類

實現(xiàn)Runnable接口來創(chuàng)建并啟動多條線程的步驟如下:

  1. 定義Runnable接口的實現(xiàn)類惨篱,并重寫該接口的run方法,該run方法的方法體同樣是該線程的線程執(zhí)行體围俘。

  2. 創(chuàng)建Runnable實現(xiàn)類的實例砸讳,并以此實例作為Thread的target來創(chuàng)建Thread對象,該Thread對象才是真正的線程對象界牡。代碼如下所示:


//創(chuàng)建Runnable實現(xiàn)類的對象

SecondThread st = new SecondThread();

//以Runnable實現(xiàn)類的對象作為Thread的target來創(chuàng)建Thread對象簿寂,即線程對象

new Thread(st);

//也可以在創(chuàng)建Thread對象時為該對象指定一個名字

//創(chuàng)建Thread對象時指定target和新線程的名字

new Thread(st,"新線程1");

下面程序示范了通過實現(xiàn)Runnable接口來創(chuàng)建并啟動多線程的程序:


public class SecondThread implements Runnable {

    private int i;

    //run方法同樣是線程執(zhí)行體

    @Override

    public void run() {

        for (; i < 100; i++) {

            //當線程類實現(xiàn)Runnable接口時,

            //如果想獲取當前線程宿亡,只能用Thread.currentThread()方法

            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){

                SecondThread st = new SecondThread();

                //通過new Thread(target,name)方法創(chuàng)建新線程

                new Thread(st,"新線程1").start();

                new Thread(st,"新線程2").start();

            }

        }

    }

}

3. 兩種方式所創(chuàng)建線程的對比

通過繼承Thread或?qū)崿F(xiàn)Runnable接口都可以實現(xiàn)多線程常遂,但兩種方式存在一定的差別,相比之下兩種方式的主要差別如下:

采用實現(xiàn)Runnable接口方式的多線程:
  1. 線程類只是實現(xiàn)了Runnable接口挽荠,還可以繼承其他類克胳。

  2. 在這種方式下,可以多個線程共享同一個target對象圈匆,所以非常適合多個相同線程來處理同一份資源的情況漠另,從而可以將CPU、代碼和數(shù)據(jù)分開臭脓,形成清晰的模型酗钞,較好的體現(xiàn)了面向?qū)ο蟮乃枷搿?/p>

  3. 劣勢是:編程稍稍復(fù)雜,如果需要訪問當前線程,必須使用Thread.currentThread()方法砚作。

采用繼承Thread類方式的多線程:
  1. 劣勢是:因為線程類已經(jīng)繼承了Thread類窘奏,所以不能再繼承其他父類。

  2. 劣勢是:編寫簡單葫录,如果需要訪問當前線程着裹,無需使用Thread.currentThread()方法,直接使用this即可獲得當前線程米同。

實際上幾乎所有的多線程應(yīng)用都可采用第一種方式骇扇,也就是實現(xiàn)Runnable接口的方式。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末面粮,一起剝皮案震驚了整個濱河市少孝,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌熬苍,老刑警劉巖稍走,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異柴底,居然都是意外死亡婿脸,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進店門柄驻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來狐树,“玉大人,你說我怎么就攤上這事鸿脓∫种樱” “怎么了?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵答憔,是天一觀的道長味赃。 經(jīng)常有香客問我,道長虐拓,這世上最難降的妖魔是什么心俗? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮蓉驹,結(jié)果婚禮上城榛,老公的妹妹穿的比我還像新娘。我一直安慰自己态兴,他們只是感情好狠持,可當我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著瞻润,像睡著了一般喘垂。 火紅的嫁衣襯著肌膚如雪甜刻。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天正勒,我揣著相機與錄音得院,去河邊找鬼。 笑死章贞,一個胖子當著我的面吹牛祥绞,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播鸭限,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼蜕径,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了败京?” 一聲冷哼從身側(cè)響起兜喻,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎赡麦,沒想到半個月后虹统,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡隧甚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了渡冻。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片散劫。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡微饥,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情雪位,我是刑警寧澤,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布专普,位于F島的核電站卖鲤,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏巍举。R本人自食惡果不足惜脆荷,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望懊悯。 院中可真熱鬧蜓谋,春花似錦、人聲如沸炭分。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽捧毛。三九已至观堂,卻和暖如春让网,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背师痕。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工溃睹, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人七兜。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓丸凭,卻偏偏與公主長得像,于是被迫代替她去往敵國和親腕铸。 傳聞我的和親對象是個殘疾皇子惜犀,可洞房花燭夜當晚...
    茶點故事閱讀 44,933評論 2 355

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

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法狠裹,內(nèi)部類的語法虽界,繼承相關(guān)的語法,異常的語法涛菠,線程的語...
    子非魚_t_閱讀 31,632評論 18 399
  • Java多線程學(xué)習(xí) [-] 一擴展javalangThread類 二實現(xiàn)javalangRunnable接口 三T...
    影馳閱讀 2,957評論 1 18
  • 本文主要講了java中多線程的使用方法莉御、線程同步、線程數(shù)據(jù)傳遞俗冻、線程狀態(tài)及相應(yīng)的一些線程函數(shù)用法礁叔、概述等。 首先講...
    李欣陽閱讀 2,454評論 1 15
  • -1- 我的心在人群中閃躲迄薄, 不懂我們之間這份真情 琅关,犯了什么錯 。若你不是你讥蔽,而我不是我 涣易,那又多快樂 。 不管...
    風(fēng)信子逸軒閱讀 1,534評論 2 3
  • 有的時候 我們遇到了很shitty卻又trivial的事情大熱天 在一個討厭的地方 熙熙攘攘的人群 也打不到車 ...
    gptsgtormf閱讀 239評論 0 1