二铺纽、接觸多線程

開篇說明,有點基礎(chǔ)哟忍,知道Thread狡门,Runnable如何使用和兩者之間的關(guān)系的可以直接跳過。

先說說Thread和Runnable之間的關(guān)系锅很,簡單到不想多說一句話其馏,看下面代碼:

public class Thread implements Runnable {
...省略,詳細自行查看源代碼...
}

看到以上代碼爆安,應(yīng)該明白了吧叛复。不明白可以看一下總結(jié):Thread類實現(xiàn)Runnable接口,創(chuàng)建一個線程的時候可以使用繼承Thread的方式鹏控,但是注意Java是單繼承的致扯,當你繼承了Thread你就無法進行其它繼承了。所以当辐,可以也實現(xiàn)Runnable接口的方式抖僵,這樣就可以繼承其他類也同時可以實現(xiàn)線程創(chuàng)建。

下面先簡單介紹Thread
//使用繼承Thread的方式缘揪,創(chuàng)建一個線程類
public class OneThread extends Thread{
    
    @Override
    public void run(){
        super.run();
        System.out.println("one thread!!!!");
    }
    
}

//再建一個測試類
public class TestThread {

    public static void main(String[] args) {
        OneThread oneThread = new OneThread();
        oneThread.start();
        System.out.println("完成耍群!");
    }

}

注意到運行結(jié)果沒有?系統(tǒng)可能先打印“完成找筝!”蹈垢,再打印“one thread!!!!”,按照平時寫單線程來說袖裕,應(yīng)該是先打印“one thread!!!!”才對吧曹抬。不過這里是多線程,OneThread類創(chuàng)建了一個線程急鳄,這個線程里面打印“one thread!!!!”谤民,而打印“完成堰酿!”是在主線程上完成的。這也就說明了张足,使用多線程之后触创,代碼運行結(jié)果跟調(diào)用順序是無關(guān)的。(“one thread!!!!”這串字符串也有可能先出現(xiàn)为牍,反正你理解上面這話就行了

下面在對以上兩個類進行一下改造哼绑,模擬一下cpu執(zhí)行哪個線程是具有不確定性的。

public class OneThread extends Thread{
    
    @Override
    public void run(){
        try {
            for (int i = 0; i < 10; i++) {
                int sleepTime = (int) (Math.random()*1000);
                Thread.sleep(sleepTime);
                System.out.println("one thread!!!!");
            }
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }
    }
    
}


public class TestThread {

    public static void main(String[] args) {
        try {
            OneThread oneThread = new OneThread();
            oneThread.start();
            for (int i = 0; i < 10; i++) {
                int sleepTime = (int) (Math.random()*1000);
                Thread.sleep(sleepTime);
                System.out.println("完成碉咆!");
            }
        } catch (InterruptedException e) {
            // TODO: handle exception
            e.printStackTrace();
        }
        
    }

}

使用一個隨機數(shù)抖韩,生成一個隨機的掛起時間。從而可以更好地觀察cpu選擇執(zhí)行哪個現(xiàn)場的不確定性疫铜。通俗點說一下線程開始執(zhí)行帽蝶,假如cpu選擇了主線程,然后主線程睡覺1秒鐘块攒,那么在這一秒鐘cpu可能就會選擇其它線程去執(zhí)行,而不會傻X那樣在等主線程佃乘,所以此時就會去執(zhí)行了其它線程囱井。大概這樣,不理解可以留言說一下趣避。

上面說了那么多順序的問題庞呕。反正一句話說到尾,多線程來說程帕,執(zhí)行順序是不確定的住练。還有,線程的啟動順序跟執(zhí)行start()方法的順序也沒什么關(guān)系的愁拭。start()執(zhí)行的順序不代表線程的啟動順序讲逛。在來兩段代碼爽爽唄!A氩骸盏混!繼續(xù)搗鼓那兩個類吧。惜论。许赃。懶,新建一個類都不想馆类。

public class OneThread extends Thread{
    
    private int i;
    //寫個帶參數(shù)的構(gòu)造方法混聊,主要用來看順序的
    public OneThread(int i){
        super();
        this.i = i;
    }
    
    @Override
    public void run(){
        System.out.println(i);
    }
    
}


public class TestThread {

    public static void main(String[] args) {
        //如各位所見,下面的start()我按順序排好的乾巧。
        OneThread o1 = new OneThread(1);
        OneThread o2 = new OneThread(2);
        OneThread o3 = new OneThread(3);
        OneThread o4 = new OneThread(4);
        OneThread o5 = new OneThread(5);
        OneThread o6 = new OneThread(6);
        o1.start();
        o2.start();
        o3.start();
        o4.start();
        o5.start();
        o6.start();
        
    }

}

運行結(jié)果句喜,絕對不是123456预愤,如果是,那么恭喜你藤滥,運氣挺好的鳖粟。無聊話說太多了。意思基本懂吧拙绊。這些都很簡單向图,甚至有些人看了會不自覺地發(fā)出,哼一聲标沪。

Thread的簡單介紹說到這里榄攀,后面還有Runnable的簡單介紹。

通過實現(xiàn)Runnable接口來實現(xiàn)多線程金句,不廢話檩赢,先上一張圖,看看Thread類的構(gòu)造方法违寞,我們上面那些用的基本都是無參的構(gòu)造方法贞瞒,如下圖,第二個趁曼,就是我們即將要用到的構(gòu)造方法:

image.png
//創(chuàng)建一個類军浆,實現(xiàn)Runnable接口。
public class OneRunnable implements Runnable {

    @Override
    public void run() {
        System.out.println("one runnable!!!");
    }

}

public class TestThread {

    public static void main(String[] args) {
        //
        Runnable runnable = new OneRunnable();
        //這里就是用到了上圖的第二個構(gòu)造方法挡闰,不用多說吧乒融,就這樣
        Thread thread = new Thread(runnable);
        thread.start();
        System.out.println("完成");
        
    }

}

直接實現(xiàn)Runnable接口這樣解決了Java單繼承這一尷尬!I忝酢T藜尽!
后面應(yīng)該先簡單一起學(xué)習(xí)下共享數(shù)據(jù)和Thread的幾個方法奢驯。

向大家推薦eclipse的vim插件申钩,太好用了。
這里不是廣告叨橱,推薦本書《Java多線程核心技術(shù)》-高洪巖典蜕,因為我是看著這本書學(xué)習(xí)的。上面的文章是學(xué)習(xí)筆記罗洗,并不是用來說教的愉舔,不要錯了點什么就噴我。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末伙菜,一起剝皮案震驚了整個濱河市轩缤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖火的,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件壶愤,死亡現(xiàn)場離奇詭異,居然都是意外死亡馏鹤,警方通過查閱死者的電腦和手機征椒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來湃累,“玉大人勃救,你說我怎么就攤上這事≈瘟Γ” “怎么了蒙秒?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長宵统。 經(jīng)常有香客問我晕讲,道長,這世上最難降的妖魔是什么马澈? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任瓢省,我火速辦了婚禮,結(jié)果婚禮上痊班,老公的妹妹穿的比我還像新娘净捅。我一直安慰自己,他們只是感情好辩块,可當我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著荆永,像睡著了一般废亭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上具钥,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天豆村,我揣著相機與錄音,去河邊找鬼骂删。 笑死掌动,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的宁玫。 我是一名探鬼主播粗恢,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼欧瘪!你這毒婦竟也來了眷射?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎妖碉,沒想到半個月后涌庭,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡欧宜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年坐榆,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片冗茸。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡席镀,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蚀狰,到底是詐尸還是另有隱情愉昆,我是刑警寧澤,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布麻蹋,位于F島的核電站跛溉,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏扮授。R本人自食惡果不足惜芳室,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望刹勃。 院中可真熱鬧堪侯,春花似錦、人聲如沸荔仁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽乏梁。三九已至次洼,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間遇骑,已是汗流浹背卖毁。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留落萎,地道東北人亥啦。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像练链,于是被迫代替她去往敵國和親翔脱。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,452評論 2 348

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