線程的創(chuàng)建與使用(一)

多線程,一個讓我學(xué)生時代感覺逼格較高的詞語之一执庐,因為聽不懂酪耕。當(dāng)時聽java多線程這部分課程時,已忘記我在干嘛轨淌,反正沒聽課迂烁。只記得有次在機(jī)房上機(jī)看尼,一男同學(xué)好像在看電視劇《老公的春天》,還被老師逮住了盟步,哈哈哈藏斩。俗話說“躲得過初一,躲不過十五”却盘,欠下的終歸要還的......


線程&多線程

線程的意義狰域,在上篇中就有提到,它作為操作系統(tǒng)調(diào)度的最小單元谷炸,多個線程能一塊執(zhí)行,提升性能禀挫,尤其在多處理器中旬陡,就不再多說了。

線程的創(chuàng)建與啟動

線程的啟動基本有三種方式:①繼承Thread语婴,重寫run()方法 ②實現(xiàn)Runnable接口描孟,重寫run()方法 ③創(chuàng)建FutureTask對象,創(chuàng)建Callable子類對象砰左,重寫call()方法匿醒。這篇先介紹下前兩種,因為它兩運(yùn)行完run()完沒有返回值缠导,而第三種是有返回值的:

繼承Thread
public class Test1 extends Thread {
    @Override
    public void run() {
        for(int i = 0; i < 10; i++){
            System.out.println("當(dāng)前線程名為:"+Thread.currentThread().getName() + "***哈哈哈***:" + i);
        }
    }
    public static void main(String[] args) {
        Test1 thread1 = new Test1();
        thread1.start();
    }
}

執(zhí)行結(jié)果如下:

單線程

這是一個最簡單的線程使用廉羔,只創(chuàng)建了一個線程對象,還是單線程僻造,再創(chuàng)建一個thread2憋他,就是多線程了。修改上面的的main函數(shù):

public static void main(String[] args) {
        Test1 thread1 = new Test1();
        Test1 thread2 = new Test1();
        thread1.start();
        thread2.start();
}

結(jié)果如下:

多線程

啟動線程的方式就是執(zhí)行Thread的start()方法髓削,strat()方法是一個native方法竹挡,它將啟動一個新線程,并執(zhí)行run()方法,可以瞅瞅它的實現(xiàn):

public synchronized void start() {
        if (threadStatus != 0)
            throw new IllegalThreadStateException();
        group.add(this);
        boolean started = false;
        try {
            start0();
            started = true;
        } finally {
            try {
                if (!started) {
                    group.threadStartFailed(this);
                }
            } catch (Throwable ignore) {
            }
        }
    }

    private native void start0();

如果一個線程對象執(zhí)行run()方法立膛,不執(zhí)行start()方法揪罕,結(jié)果是怎樣的?繼續(xù)拿第一個單線程來試驗:

public static void main(String[] args) {
        Test1 thread1 = new Test1();
        thread1.run();
}

結(jié)果和thread.start()一模一樣宝泵,因為Thread也是Runnable的實現(xiàn)類好啰。



那么如果一個線程對象多次調(diào)用start()方法和run()方法的情況是怎樣的?來儿奶,接著試:

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

結(jié)果報錯:

在Thread的start()方法處打斷點坎怪,可以看到thread1對象第一次執(zhí)行start()方法時,threadStatus=0廓握,成功執(zhí)行搅窿;當(dāng)thread1第二次執(zhí)行start()方法時嘁酿,threadStatus=2(這個狀態(tài)值并不是固定的,但都非零)男应,拋出了異常闹司,說明了同一個線程對象不能多次執(zhí)行start()方法

第一次執(zhí)行start()

第二次執(zhí)行start()

接著咱們看一個線程對象多次執(zhí)行run()方法:

public static void main(String[] args) {
        Test1 thread1 = new Test1();
        thread1.run();
        thread1.run();
}

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


可以看到沐飘,這時候并沒有開啟新的線程游桩,main線程直接調(diào)用執(zhí)行了run()方法中代碼。所以耐朴,start()會開啟新的線程并在新線程中執(zhí)行run()方法借卧,而run()方法不會開啟新線程。

實現(xiàn)Runnable接口

public class Test2 implements Runnable {
    @Override
    public void run() {
        for(int i =0; i < 10; i++){
            System.out.println("當(dāng)前線程名為:"+Thread.currentThread().getName() + "***哈哈哈***:" + i);
        }
    }
    public static void main(String[] args) {
        Test2 test2 = new Test2();
        Thread thread1 = new Thread(test2);
        thread1.start();
    }
}

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


這個也是單線程筛峭,為了啟動線程铐刘,先創(chuàng)建一個Thread實例,再將Test2實例傳入影晓,在Thread所實現(xiàn)的run()方法處打斷點镰吵,可以看見Thread的run()方法就會調(diào)用target.run()。


小結(jié)

此篇主要介紹了兩種無返回結(jié)果的線程創(chuàng)建方式挂签。兩種方式的區(qū)別如下:①繼承Thread這種不是很靈活疤祭,因Java的單一繼承性,繼承了Thread就別再妄想繼承別的類了;②實現(xiàn)Runnable接口這種方式就巧妙地避開了這個弊端,更加符合面向?qū)ο蟮木幊谭绞狡狭#步档土司€程對象和線程任務(wù)的耦合性域蜗。總之,建議使用第二種實現(xiàn)Runnable的方式來創(chuàng)建線程。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市续挟,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌侥衬,老刑警劉巖诗祸,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異轴总,居然都是意外死亡直颅,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進(jìn)店門怀樟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來功偿,“玉大人,你說我怎么就攤上這事往堡⌒岛桑” “怎么了共耍?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長吨瞎。 經(jīng)常有香客問我痹兜,道長,這世上最難降的妖魔是什么颤诀? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任字旭,我火速辦了婚禮,結(jié)果婚禮上崖叫,老公的妹妹穿的比我還像新娘遗淳。我一直安慰自己,他們只是感情好心傀,可當(dāng)我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布屈暗。 她就那樣靜靜地躺著,像睡著了一般剧包。 火紅的嫁衣襯著肌膚如雪恐锦。 梳的紋絲不亂的頭發(fā)上往果,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天疆液,我揣著相機(jī)與錄音,去河邊找鬼陕贮。 笑死堕油,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的肮之。 我是一名探鬼主播掉缺,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼戈擒!你這毒婦竟也來了眶明?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤筐高,失蹤者是張志新(化名)和其女友劉穎搜囱,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體柑土,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蜀肘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了稽屏。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片扮宠。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖狐榔,靈堂內(nèi)的尸體忽然破棺而出坛增,到底是詐尸還是另有隱情获雕,我是刑警寧澤,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布轿偎,位于F島的核電站典鸡,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏坏晦。R本人自食惡果不足惜萝玷,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望昆婿。 院中可真熱鬧球碉,春花似錦、人聲如沸仓蛆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽看疙。三九已至豆拨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間能庆,已是汗流浹背施禾。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留搁胆,地道東北人弥搞。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像渠旁,于是被迫代替她去往敵國和親攀例。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,465評論 2 348

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

  • 本文主要講了java中多線程的使用方法顾腊、線程同步粤铭、線程數(shù)據(jù)傳遞、線程狀態(tài)及相應(yīng)的一些線程函數(shù)用法杂靶、概述等梆惯。 首先講...
    李欣陽閱讀 2,444評論 1 15
  • Java多線程學(xué)習(xí) [-] 一擴(kuò)展javalangThread類 二實現(xiàn)javalangRunnable接口 三T...
    影馳閱讀 2,952評論 1 18
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法伪煤,內(nèi)部類的語法加袋,繼承相關(guān)的語法,異常的語法抱既,線程的語...
    子非魚_t_閱讀 31,598評論 18 399
  • 前言 多線程并發(fā)編程是Java編程中重要的一塊內(nèi)容职烧,也是面試重點覆蓋區(qū)域,所以學(xué)好多線程并發(fā)編程對我們來說極其重要...
    嘟爺MD閱讀 7,308評論 21 272
  • 能進(jìn)去這么一個社群和大家一同學(xué)習(xí)進(jìn)步是一件美好的事情,感覺到路上不那么孤單蚀之,而且看著大家睿智的發(fā)言蝗敢,碰撞出了思想交...
    Toradola閱讀 203評論 0 1