摘要:是多線程之間通信最重要的個(gè)方法,今天,棧長(zhǎng)給大家普及一下它們的知識(shí)要點(diǎn)及應(yīng)用實(shí)戰(zhàn)。實(shí)戰(zhàn)微信公眾號(hào)技術(shù)棧技術(shù)棧上面的例子結(jié)合來演示了它們的相互作用。更多多線程技術(shù)文章請(qǐng)?jiān)诩夹g(shù)棧微信公眾號(hào)后臺(tái)回復(fù)關(guān)鍵字多線程。
wait, notify, notifyAll 是多線程之間通信最重要的 3 個(gè)方法,今天,棧長(zhǎng)給大家普及一下它們的知識(shí)要點(diǎn)及應(yīng)用實(shí)戰(zhàn)。
定義wait:讓持有該對(duì)象鎖的線程等待;
notify: 喚醒任何一個(gè)持有該對(duì)象鎖的線程;
notify: 喚醒所有持有該對(duì)象鎖的線程;
它們 3 個(gè)的關(guān)系是,調(diào)用對(duì)象的 wait 方法使線程暫停運(yùn)行,通過 notify/ notifyAll 方法喚醒調(diào)用 wait 暫時(shí)的線程。
然而,它們并不是 Thread 類中的方法,而是 Object 類中的,為什么呢!? 因?yàn)槊總€(gè)對(duì)象都有監(jiān)視鎖,線程要操作某個(gè)對(duì)象當(dāng)然是要獲取某個(gè)對(duì)象的鎖了,而不是線程的鎖。
如圖所示,wait 帶時(shí)間表示最大超時(shí)時(shí)間,過了時(shí)間還不喚醒就會(huì)自動(dòng)喚醒線程重新競(jìng)爭(zhēng)對(duì)象鎖。
幾個(gè)重要的點(diǎn)1、調(diào)用對(duì)象的 wait, notify, notifyAll 方法需要擁有對(duì)象的監(jiān)視器鎖,即它們只能在同步方法(塊)中使用;
2、調(diào)用 wait 方法會(huì)使用線程暫停并讓出 CPU 資源,同時(shí)釋放持有的對(duì)象的鎖;
3、多線程使用 notify 容易發(fā)生死鎖,一般使用 notifyAll;
4、關(guān)于 wait 和 sleep 的詳細(xì)區(qū)別請(qǐng)翻閱 《多線程 sleep 和 wait 的 5 個(gè)區(qū)別》這篇文章。
實(shí)戰(zhàn)/** * 微信公眾號(hào):Java技術(shù)棧 */ public static void main(String[] args) { Object lock = new Object(); Thread t1 = new Thread(() -> { synchronized (lock) { for (int i = 0; i < 20; i++) { System.out.print(i); if (i == 10) { try { lock.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } } }); Thread t2 = new Thread(() -> { synchronized (lock) { try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.print("Java技術(shù)棧"); lock.notifyAll(); } }); t1.start(); t2.start(); }
上面的例子結(jié)合 wait/ notifyAll 來演示了它們的相互作用。
線程 t1 首先輸出 012345678910,5秒后繼續(xù)輸出 Java技術(shù)棧111213141516171819。
更多 Java 多線程技術(shù)文章請(qǐng)?jiān)贘ava技術(shù)棧微信公眾號(hào)后臺(tái)回復(fù)關(guān)鍵字:多線程。
本文原創(chuàng)首發(fā)于微信公眾號(hào):Java技術(shù)棧(id:javastack),關(guān)注公眾號(hào)在后臺(tái)回復(fù) "多線程" 可獲取更多,轉(zhuǎn)載請(qǐng)?jiān)瓨颖A舯拘畔ⅰ?/pre>
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/72436.html
摘要:據(jù)我了解,很多學(xué)校在學(xué)習(xí)的時(shí)候,老師會(huì)讓學(xué)生死記一條語句,那就是那么你真的了解它嗎命名空間是一個(gè)命名空間。如果我們真的想使用的話,的命名空間遍給了我們解決方法使用命名空間。 據(jù)我了解,很多學(xué)校在學(xué)習(xí)c++的時(shí)候,老師會(huì)讓學(xué)生死記一條語句,那就是 using?namespace?std; 那么...
摘要:哪吒社區(qū)技能樹打卡打卡貼函數(shù)式接口簡(jiǎn)介領(lǐng)域優(yōu)質(zhì)創(chuàng)作者哪吒公眾號(hào)作者架構(gòu)師奮斗者掃描主頁左側(cè)二維碼,加入群聊,一起學(xué)習(xí)一起進(jìn)步歡迎點(diǎn)贊收藏留言前情提要無意間聽到領(lǐng)導(dǎo)們的談話,現(xiàn)在公司的現(xiàn)狀是碼農(nóng)太多,但能獨(dú)立帶隊(duì)的人太少,簡(jiǎn)而言之,不缺干 ? 哪吒社區(qū)Java技能樹打卡?【打卡貼 day2...
摘要:方法區(qū)在實(shí)際內(nèi)存空間站可以是不連續(xù)的。這一規(guī)定,可以說是給了虛擬機(jī)廠商很大的自由。但是值得注意的是,堆其實(shí)還未每一個(gè)線程單獨(dú)分配了一塊空間,這部分空間在分配時(shí)是線程獨(dú)享的,在使用時(shí)是線程共享的。 在我的博客中,之前有很多文章介紹過JVM內(nèi)存結(jié)構(gòu),相信很多看多我文章的朋友對(duì)這部分知識(shí)都有一定的了解了。 那么,請(qǐng)大家嘗試著回答一下以下問題: 1、JVM管理的內(nèi)存結(jié)構(gòu)是怎樣的? 2、不同的...
摘要:當(dāng)你使用的活動(dòng)監(jiān)視器你會(huì)發(fā)現(xiàn),實(shí)際的進(jìn)程數(shù)為菜鳥是因?yàn)榫€程池的原因嗎老鳥不錯(cuò)嘛,還知道線程池呢但非也非也。菜鳥竟然不是線程池老鳥你忽視了集成了引擎。啟動(dòng)后會(huì)創(chuàng)建實(shí)例,而實(shí)例是多線程的。 老鳥:伸著懶腰,看著窗外明媚的陽光,喝一口清茶,心情大美。一天的好心情莫過于此。老鳥:菜鳥,你這消失了大半個(gè)月,忙什么呢?菜鳥:聽說node最近很火,這不趁著年輕,多儲(chǔ)存點(diǎn)知識(shí)儲(chǔ)備呢!老鳥:那你說說你對(duì)...
閱讀 796·2021-11-12 10:36
閱讀 3376·2021-09-08 10:44
閱讀 2748·2019-08-30 11:08
閱讀 1405·2019-08-29 16:12
閱讀 2676·2019-08-29 12:24
閱讀 900·2019-08-26 10:14
閱讀 686·2019-08-23 18:32
閱讀 1176·2019-08-23 17:52