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