并發(fā)編程——線程中sleep(),yield(),join(),wait(),notify(),notifyAll()區(qū)別

前言

今天簡單的講一講線程中sleep(),join(),yield(),wait(),notify(),notifyAll()這些方法的使用以及區(qū)別豹爹。
不過在講這些方法之前榴徐,需要簡單的介紹一下鎖池和等待池的概念膳灶。

專欄推薦:
并發(fā)編程專欄

鎖池和等待池

1.鎖池

所有需要競爭同步鎖的線程都會放在鎖池當(dāng)中嚎莉,比如當(dāng)前對象的鎖已經(jīng)被其中一個線程得到悯搔,則其他線程需要在這個鎖池進(jìn)行等待灾常,當(dāng)前面的線程釋放同步鎖后鎖池中的線程去競爭同步鎖,當(dāng)某個線程得到后會進(jìn)入就緒隊列進(jìn)行等待cpu資源分配鲫惶。

2.等待池

當(dāng)我們調(diào)用wait()方法后蜈首,線程會放到等待池當(dāng)中实抡,等待池的線程是不會去競爭同步鎖欠母。只有調(diào)用了notify()或notifyAll()后等待池的線程才會開始去競爭鎖欢策,notify()是隨機(jī)從等待池選出一個線程放到鎖池,而notifyAll()是將等待池的所有線程放到鎖池當(dāng)中

sleep()

首先看一下sleep方法的源碼赏淌,我們發(fā)現(xiàn)sleep是一個靜態(tài)方法踩寇,它接受一個long類型的毫秒值參數(shù),而且是一個本地方法(native修飾)六水,而且會拋出InterruptedException(中斷異常)俺孙。


sleep()這個方法的使用很簡單,因為它是一個Thread的靜態(tài)方法掷贾,所以就可以直接Thread.sleep(毫秒值)睛榄,休眠指定的毫秒數(shù)。

1想帅、使當(dāng)前線程(即調(diào)用該方法的線程)暫停執(zhí)行一段時間场靴,讓其他線程有機(jī)會執(zhí)行。但是時間到了之后線程會進(jìn)入就緒隊列港准,重新去競爭cpu資源旨剥。

2.sleep()會釋放cpu資源,但是不會釋放同步鎖(類鎖和對象鎖)

例如有兩個線程同時執(zhí)行(沒有synchronized)一個線程優(yōu)先級為MAX_PRIORITY浅缸,另一個為MIN_PRIORITY轨帜,如果沒有Sleep()方法,只有高優(yōu)先級的線程執(zhí)行完畢后衩椒,低優(yōu)先級的線程才能夠執(zhí)行蚌父;但是高優(yōu)先級的線程sleep(500)后,低優(yōu)先級就有機(jī)會執(zhí)行了毛萌。

總之梢什,sleep()可以使低優(yōu)先級的線程得到執(zhí)行的機(jī)會,當(dāng)然也可以讓同優(yōu)先級朝聋、高優(yōu)先級的線程有執(zhí)行的機(jī)會嗡午。

yield()

使當(dāng)前正在執(zhí)行的線程向另一個線程交出運行權(quán)。注意這是一個靜態(tài)方法冀痕。
該方法與sleep()類似荔睹,只是不能由用戶指定暫停多長時間,并且yield()方法只能讓同優(yōu)先級的線程有執(zhí)行的機(jī)會言蛇。
1僻他、yield()執(zhí)行后線程直接進(jìn)入就緒狀態(tài)。
2腊尚、yield()會釋放cpu資源吨拗,但是不會釋放同步鎖(類鎖和對象鎖)

join()

執(zhí)行后線程進(jìn)入阻塞狀態(tài),例如在線程B中調(diào)用線程A的join(),那線程B會進(jìn)入到阻塞隊列劝篷,直到j(luò)oin結(jié)束或中斷線程B才開始進(jìn)入阻塞隊列哨鸭。
可以實現(xiàn)一個線程的順序執(zhí)行。


下面舉一個小例子:
我排隊打飯,smile女神來了,我讓她先打飯娇妓,但是這個時候她男朋友來了像鸡,smile女神讓他男朋友先打飯。嗚嗚嗚~~~~

public class UseJoin {
   
    static class Smile implements Runnable {
        private Thread thread;

        public Smile(Thread thread) {
            this.thread = thread;
        }

        public Smile() {
        }

        public void run() {
            System.out.println("smile開始排隊打飯.....");
            try {
                if(thread!=null) thread.join();
            } catch (InterruptedException e) {
            }
            SleepTools.second(2);//休眠2秒
            System.out.println(Thread.currentThread().getName()
                    + " smile打飯完成.");
        }
    }

    static class SmileBoyfriend implements Runnable {

        public void run() {
            SleepTools.second(2);//休眠2秒
            System.out.println("smileBoyfriend開始排隊打飯.....");
            System.out.println(Thread.currentThread().getName()
                    + " smileBoyfriend打飯完成.");
        }
    }

    public static void main(String[] args) throws Exception {
        SmileBoyfriend smileBoyfriend = new SmileBoyfriend();
        Thread sbf = new Thread(smileBoyfriend);
        Smile smile = new Smile(sbf);
        Thread s = new Thread(smile);
        s.start();//我排隊打飯
        sbf.start();//smile女神來了,但是這個時候她男朋友來了哈恰,smile女神讓他男朋友先打飯
        System.out.println("chaoCode開始排隊打飯.....");
        s.join();
        Thread.sleep(2000);//讓主線程休眠2秒
        System.out.println(Thread.currentThread().getName() + " chaoCode打飯完成.");
    }
}

執(zhí)行結(jié)果只估,可想而知,抱抱可憐的自己着绷。

wait()和notify()蛔钙、notifyAll()

1、wait方法用于協(xié)調(diào)多個線程對共享數(shù)據(jù)的存取荠医,所以必須在Synchronized語句塊內(nèi)使用
2夸楣、wait()方法使當(dāng)前線程暫停執(zhí)行并釋放會cpu資源,以及同步鎖(類鎖和對象鎖)
3子漩、調(diào)用wait()后必須調(diào)用notify()或notifyAll()后線程才會從等待池進(jìn)入到鎖池豫喧,當(dāng)我們的線程競爭得到同步鎖后就會重新進(jìn)入緒狀態(tài)等待cpu資源分配

當(dāng)調(diào)用notify()方法后,將從對象的等待池中移走一個任意的線程并放到鎖標(biāo)志等待池中幢泼,只有鎖標(biāo)志等待池中線程能夠獲取鎖標(biāo)志紧显;如果鎖標(biāo)志等待池中沒有線程,則notify()不起作用缕棵。

notifyAll()則從對象等待池中移走所有等待那個對象的線程并放到鎖標(biāo)志等待池中孵班。

注意:

1、這三個方法都是java.lang.Object的方法招驴。

2篙程、notif()方法要配合wait()方法使用,一般在wait()之后調(diào)用或者在線程結(jié)束時調(diào)用才會成功别厘。

感謝諸君的觀看虱饿,文中如有紕漏,歡迎在評論區(qū)來交流触趴。如果這篇文章幫助到了你氮发,歡迎點贊??關(guān)注。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末冗懦,一起剝皮案震驚了整個濱河市爽冕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌披蕉,老刑警劉巖颈畸,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件乌奇,死亡現(xiàn)場離奇詭異,居然都是意外死亡眯娱,警方通過查閱死者的電腦和手機(jī)礁苗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來困乒,“玉大人寂屏,你說我怎么就攤上這事贰谣∧嚷В” “怎么了?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵吱抚,是天一觀的道長百宇。 經(jīng)常有香客問我,道長秘豹,這世上最難降的妖魔是什么携御? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮既绕,結(jié)果婚禮上啄刹,老公的妹妹穿的比我還像新娘。我一直安慰自己凄贩,他們只是感情好誓军,可當(dāng)我...
    茶點故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著疲扎,像睡著了一般昵时。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上椒丧,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天壹甥,我揣著相機(jī)與錄音,去河邊找鬼壶熏。 笑死句柠,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的棒假。 我是一名探鬼主播俄占,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼录别,長吁一口氣:“原來是場噩夢啊……” “哼舟茶!你這毒婦竟也來了纽哥?” 一聲冷哼從身側(cè)響起裳食,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤慨代,失蹤者是張志新(化名)和其女友劉穎士袄,沒想到半個月后鸟召,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體怜校,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年鹰贵,在試婚紗的時候發(fā)現(xiàn)自己被綠了晴氨。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡碉输,死狀恐怖籽前,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情敷钾,我是刑警寧澤枝哄,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站阻荒,受9級特大地震影響挠锥,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜侨赡,卻給世界環(huán)境...
    茶點故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一蓖租、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧羊壹,春花似錦蓖宦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至眨攘,卻和暖如春主慰,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背鲫售。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工共螺, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人情竹。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓藐不,卻偏偏與公主長得像,于是被迫代替她去往敵國和親秦效。 傳聞我的和親對象是個殘疾皇子雏蛮,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,601評論 2 353

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