Java多線程實戰(zhàn)筆記一

一榆纽、 多線程與多進(jìn)程的區(qū)別:

最本質(zhì)的區(qū)別是每個進(jìn)程擁有自己的一整套變量,而線程則共享數(shù)據(jù)坑质。 共享變量使得線程之間的通信比進(jìn)程之
間的通信更有效痒留、更容易购披。同時芹敌,與進(jìn)程相比痊远,線程更加“輕量級”,創(chuàng)建氏捞、撤銷一個線程比啟動新繼承的開銷要
小得多碧聪。

二、Thread提供的主要方法

  1. Thread(Runnable r);
  2. void start();
  3. void run();
  4. Thread currentThread();
  5. static boolean interrupted();
  6. boolean isInterrupted();
  7. sleep(long s);
  8. void interrupt();
  9. void join();
  10. void join(long s);
  11. Thread.State getState();

三液茎、 調(diào)用時機(jī)與主要區(qū)別

①創(chuàng)建線程主要有兩種方式逞姿,一種是繼承Thread辞嗡,重寫run方法,另一種是實現(xiàn)Runnanble接口滞造,并作為Thread的一個參數(shù)续室。代碼示例如下:

//繼承Thread
class MyThread extends Thread{
    @Override
    public void run(){
        System.out.println("hello my thread");
    }
}
Thread thread = new Thread(new MyThread());

//實現(xiàn)Runnable接口
class MyRunnable implements Runnable{
    @Override
    public void run() {
        System.out.println("hello my runnable");
    }
}
Thread thread = new Thread(new MyRunnable());    

//也是實現(xiàn)Runnable接口,通常為了方便會使用這種方式
Thread thread = new Thread(new Runnable() {
        @Override
        public void run() {
            try{
                Thread.sleep(2000);
                t1.interrupt();
            }catch (InterruptedException e){
                e.getMessage();
            }
        }
    });

②啟動線程

thread.start();

注意:直接調(diào)用run方法只是在原來的線程執(zhí)行run方法與普通的方法并沒有區(qū)別谒养,而調(diào)用是start方法則會新創(chuàng)建一個線程挺狰,并在該新線程中執(zhí)行run方法。

③線程的中斷

雖然有強(qiáng)制中斷線程的stop方法蝴光,但是已經(jīng)被棄用∷剩現(xiàn)在一般是通過設(shè)置中斷標(biāo)志位的方式來實現(xiàn)線程中斷达址。即在線程中執(zhí)行重復(fù)操作時蔑祟,將線程的中斷標(biāo)志位作為執(zhí)行循環(huán)的條件之一。

a. 通過Thread.currentThread()獲取當(dāng)前線程沉唠。
b. 通過thread.isInterrupted()來判斷thread這個線程是否被中斷置位疆虚,true代表被請求中斷。
c. 通過Thread.interrupted()來判斷執(zhí)行這條語句的線程是否被中斷置位满葛,同時會清除該線程的中斷狀態(tài)径簿。
d. 通過Thread.sleep(s)來使得當(dāng)前線程進(jìn)入休眠狀態(tài)s毫秒(雖然中斷和休眠好像沒有什么聯(lián)系,后面會講)

先來個需求:如果我們有兩個線程t1和t2嘀韧,在t1中循環(huán)執(zhí)行某些操作篇亭,同時t2要能決定t1什么時候結(jié)束。代碼實現(xiàn):

Thread t1 = new Thread(new Runnable(){
    @Override
    public void run(){
        while(Thread.currentThread.isInterrupted() == false && more work to do){
            //more work to do
        }
    }
});
Thread t2 = new Thread(new Runnable(){
    @Override
    public void run(){
        try{
            t1.interrupt();
        }catch(Exception e){
            e.getMessage();
        }
    }
});
t1.start();
t2.start();

第一個挺簡單的锄贷,沒有什么陷阱译蒂,那再來一個,如果這個時候我們要求t1沒處理完一次操作要休眠一段時間呢谊却。
看起來好像很簡單柔昼,之前也被坑過,難道不是直接在t1的循環(huán)體內(nèi)添加Thread.sleep()并捕捉中斷異常嗎炎辨。正常邏輯是如此捕透,可是sleep方法很奇特,如果中斷標(biāo)識被置位時執(zhí)行sleep方法碴萧,sleep不但不休眠而且會清除中斷標(biāo)識的狀態(tài)乙嘀,也就是中斷標(biāo)識位和sleep同時“失效”,也就是不按照我們所想的方式執(zhí)行破喻。那么正確的做法應(yīng)該是怎樣呢虎谢。代碼如下:

    Thread t1 = new Thread(new Runnable() {
        @Override
        public void run() {
            try{
                while(true){
                    System.out.println(""+x++);
                    Thread.sleep(1000);//sleep和中斷標(biāo)志位的正確組合用法
                }
            }catch (InterruptedException e){
                e.getMessage();
            }
        }
    });
    Thread t2 = new Thread(new Runnable() {
        @Override
        public void run() {
            try{
                Thread.sleep(2000);
                t1.interrupt();
            }catch (InterruptedException e){
                e.getMessage();
            }
        }
    });
    t1.start();
    t2.start();

四、小結(jié)

①Thread.currentThread().isinterrupted() 與 Thread.interrupted()的主要區(qū)別在于前者只做判斷低缩,而后者除了做判斷外還會清除線程的中斷狀態(tài)嘉冒。
②Thread.sleep()也會清除線程的中斷狀態(tài)曹货,并且會拋出InterruptedException的異常,從而使得中斷狀態(tài)取消并且不會進(jìn)入休眠狀態(tài)讳推。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末顶籽,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子银觅,更是在濱河造成了極大的恐慌礼饱,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件究驴,死亡現(xiàn)場離奇詭異镊绪,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)洒忧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進(jìn)店門蝴韭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人熙侍,你說我怎么就攤上這事榄鉴。” “怎么了蛉抓?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵庆尘,是天一觀的道長。 經(jīng)常有香客問我巷送,道長驶忌,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任笑跛,我火速辦了婚禮付魔,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘堡牡。我一直安慰自己抒抬,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布晤柄。 她就那樣靜靜地躺著擦剑,像睡著了一般。 火紅的嫁衣襯著肌膚如雪芥颈。 梳的紋絲不亂的頭發(fā)上惠勒,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天,我揣著相機(jī)與錄音爬坑,去河邊找鬼纠屋。 笑死,一個胖子當(dāng)著我的面吹牛盾计,可吹牛的內(nèi)容都是我干的售担。 我是一名探鬼主播赁遗,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼族铆!你這毒婦竟也來了岩四?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤哥攘,失蹤者是張志新(化名)和其女友劉穎剖煌,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體逝淹,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡耕姊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了栅葡。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片茉兰。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖妥畏,靈堂內(nèi)的尸體忽然破棺而出邦邦,到底是詐尸還是另有隱情,我是刑警寧澤醉蚁,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站鬼店,受9級特大地震影響网棍,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜妇智,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一滥玷、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧巍棱,春花似錦惑畴、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至到踏,卻和暖如春杠袱,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背窝稿。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工楣富, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人伴榔。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓纹蝴,卻偏偏與公主長得像庄萎,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子塘安,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,762評論 2 345

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