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