重學java 42.多線程 等待喚醒機制案例分析

Strength is built under a heavy load,I am expecting to pick up all of my loads and travel on.?

?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????—— 24.5.24

章節重點

1.會用wait和notify兩個方法
2.會使用Lock鎖對象
3.會利用Cal1able接口實現多線程
4.會使用線程池完成多線程

等待喚醒案例分析(線程之間的通信)

要求:

????????一個線程生成,一個線程消費,不能連續生產和消費 ——> 等待喚醒機制(生產者,消費者)(線程之間的通信)

方法:

????????void wait()線程等待,等待的過程中線程會釋放鎖,需要被其他線程調用notify方法將其喚醒,重新搶鎖執行
????????void notify()線程喚醒,一次喚醒一個等待線程;如果有多條線程等待,則隨機喚醒一條等待線程

? ? ? ? void notifyAll():喚醒所有等待線程

wait和notify方法需要鎖對象調用,所以需要用到同步代碼塊中,而且必須是同一個鎖對象

案例:

????????包子鋪生產和消費的案例,一個線程生產包子,一個線程消費包子,但是不能連續生產,也不能連續消費(需要生產一個消費一個)

JavaBean

package S75ThreadWaitNotify;public class BaoZiPu {// 包子的數目countprivate int count;// 是否有包子flagprivate boolean flag;public BaoZiPu() {}public BaoZiPu(int count, boolean flag) {this.count = count;this.flag = flag;}// getCount改成消費包子,直接輸出包子數量countpublic void getCount() {System.out.println("消費了第"+count+"個包子");}// setCount改造成生產包子,count++public void setCount() {count++;System.out.println("生產了第"+count+"個包子");}public boolean isFlag() {return flag;}public void setFlag(boolean flag) {this.flag = flag;}
}

生產線程

package S76ThreadWaitNotify;// 實現Runnable接口
public class Product implements Runnable{private BaoZiPu baoZiPu;public Product(BaoZiPu baoZiPu){this.baoZiPu = baoZiPu;}@Overridepublic void run() {// 定義一個死循環while(true) {try {Thread.sleep(100L);}catch (InterruptedException e){throw new RuntimeException(e);}// 同步代碼塊synchronized (baoZiPu){// 1.判斷flag是否為true,如果是true,證明有包子,生產線程等待if(baoZiPu.isFlag()==true){try{baoZiPu.wait();}catch(InterruptedException e){throw new RuntimeException(e);}}// 2.如果flag為false,則要開始生產baoZiPu.setCount();// 3.改變flag為truebaoZiPu.setFlag(true);// 4.喚醒喚醒生產線程baoZiPu.notify();}}}
}

消費線程

package S76ThreadWaitNotify;public class Consumer implements Runnable{private BaoZiPu baoZiPu;public Consumer(BaoZiPu baoZiPu){this.baoZiPu = baoZiPu;}@Overridepublic void run() {while(true) {try {Thread.sleep(100L);}catch (InterruptedException e){throw new RuntimeException(e);}// 同步代碼塊synchronized (baoZiPu){// 1.判斷flag是否為false,如果是false,證明沒有包子,消費線程等待if(baoZiPu.isFlag()==false){// 拋出異常try{baoZiPu.wait();}catch(InterruptedException e){throw new RuntimeException(e);}}// 2.如果flag為true,則要開始消費baoZiPu.getCount();// 3.改變flag為false,消費完了,沒有包子了baoZiPu.setFlag(false);// 4.喚醒消費線程baoZiPu.notify();}}}
}

Test

package S75ThreadWaitNotify;public class Demo214Test {public static void main(String[] args) {// 變成同一個對象BaoZiPu baoZiPu = new BaoZiPu();Product product = new Product(baoZiPu);Consumer consumer = new Consumer(baoZiPu);Thread thread1 = new Thread(product);Thread thread2 = new Thread(consumer);thread1.start();thread2.start();}
}

運行結果:(先生產線程進行判斷,若flag為false,則wait等待,讓出鎖讓consume消費現場先執行,若消費線程的包子數量為0,則喚醒生產線程,consume等待)

也可以同步方法實現等待喚醒,直接在BaoZiPu函數中定義同步方法,也可以解決等待喚醒問題

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/14635.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/14635.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/14635.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C++ TCP發送Socket數據

DEVC需要加入ws2_32庫 #include <iostream> #include <winsock2.h>#pragma comment(lib, "ws2_32.lib")void sendData(const char* ip, int port, const char* data) {WSADATA wsaData;SOCKET sockfd;struct sockaddr_in server_addr;// 初始化Winsock…

Qt moc系統的黑魔法?

Qt的元對象系統&#xff08;Meta-Object System&#xff09;是Qt框架的核心功能之一&#xff0c;為C語言增加了一些動態特性&#xff0c;借助元對象系統Qt可以實現以下功能 信號與槽機制&#xff08;Signals and Slots&#xff09;運行時類型信息&#xff08;Run-Time Type In…

【高頻】從輸入URL到頁面展示到底發生了什么?

一、相關衍生面試問題&#xff1a; 瀏覽器輸入美團網站&#xff0c;從回車到瀏覽器展示經歷了哪些過程 &#xff1f; http輸入網頁之后的流程&#xff1f; 百度搜索頁面&#xff0c;從點開搜索框&#xff0c;到顯示搜索頁面經歷了什么&#xff1f; 二、探究各個過程&#x…

XML Schema 字符串數據類型及約束詳解

字符串數據類型用于包含字符字符串的值。字符串數據類型可以包含字符、換行符、回車符和制表符。 以下是模式中字符串聲明的示例&#xff1a; <xs:element name"customer" type"xs:string"/>您文檔中的一個元素可能如下所示&#xff1a; <custo…

maven--解決Idea沒有拉取SNAPSHOT的問題

原文網址&#xff1a;maven--解決Idea沒有拉取SNAPSHOT的問題_IT利刃出鞘的博客-CSDN博客 簡介 本文介紹Idea解決maven沒有拉取SNAPSHOT的問題。 問題描述 項目依賴了以-SNAPSHOT結尾的包&#xff0c;它更新了。Idea點了重新導入后沒有拉取到最新的包&#xff1a; 解決方案…

什么是分賬系統呢?云分帳系統的實現功能有哪些?

隨著電商平臺的發展&#xff0c;越來越多的商家開始通過在線平臺進行銷售&#xff0c;平臺業務場景的逐漸復雜&#xff0c;多渠道收款、多方分賬。在些場景下如何解決這些問題成為電商平臺急需解決的核心問題。 為了解決這些問題&#xff0c;電商平臺可以引入分賬系統即可輕松解…

從“圖形可視化”到“圖生代碼”,低代碼平臺的新挑戰

前言&#xff1a; 低代碼平臺最大的一個特點就是可視化&#xff0c;將代碼采用可視化的方式展示管理。一時間擁有圖形化界面的各類系統都掛上了低代碼的標簽。但更多的代碼從業者在使用中卻發現&#xff0c;在眾多的低代碼平臺中都是“別人家的代碼”其可視化主要是別人家的代…

如何解決vcruntime140.dll丟失問題,詳細介紹5種靠譜的解決方法

vcruntime140.dll是Microsoft Visual C Redistributable Package的一部分&#xff0c;它為使用Visual C編譯器開發的應用程序提供必要的運行時環境。該DLL文件包含了大量應用程序運行時需要調用的庫函數&#xff0c;這些函數是實現C標準庫、異常處理機制、RTTI&#xff08;運行…

圖搜索算法教程(個人總結版)

圖搜索算法是一類用于遍歷或搜索圖結構的算法&#xff0c;廣泛應用于網絡分析、路徑規劃、人工智能等領域。常見的圖搜索算法包括深度優先搜索&#xff08;DFS&#xff09;、廣度優先搜索&#xff08;BFS&#xff09;、Dijkstra算法、A*算法等。本文將詳細介紹這些圖搜索算法的…

創建JSON數據包

在C語言中&#xff0c;JSON不是一種內置的數據類型&#xff0c;因此你需要使用第三方庫來創建和解析JSON數據。一個流行的庫是cJSON&#xff0c;它允許你以C語言的方式操作JSON數據。 以下是一個使用cJSON庫創建類似于你給出的JSON數據包的示例&#xff1a; 首先&#xff0c;…

go-zero 實戰(5)

引入Prometheus 用 Prometheus 監控應用 1. 用 docker 啟動 Prometheus 編輯配置位置&#xff0c;我將 prometheus.yaml 和 targets.json 文件放在了 /opt/prometheus/conf目錄下 prometheus.yaml global:scrape_interval: 15s # 抓取間隔evaluation_interval: 15s # 評估…

【代碼隨想錄 二叉樹】二叉樹前序、中序、后序遍歷的迭代遍歷

文章目錄 1. 二叉樹前序遍歷&#xff08;迭代法&#xff09;2. 二叉樹后序遍歷&#xff08;迭代法&#xff09;3. 二叉樹中序遍歷&#xff08;迭代法&#xff09; 1. 二叉樹前序遍歷&#xff08;迭代法&#xff09; 題目連接 &#x1f34e;因為處理順序和訪問順序是一致的。所…

前端工程化-babel、corejs、postcss

出處&#xff1a;前端工程化-babel、corejs、postcss | 劉維_個人博客_編程秘籍_開發技巧_入門到精通_生活感悟 (ldlw.site) 一. babel和corejs的作用到底是什么 腦子里面的想法 es6 -> es5 es6里面其實有兩種東西 語法 新特性 轉的語法 const a 1 const b &#xf…

Shader GLSL 3D旋轉函數

mat4 rotationMatrix(vec3 axis, float angle) {axis = normalize(axis);float s = sin(angle);float c = cos(angle)

類和對象的基本概念

類和對象的基本概念 C和C中struct區別類的封裝封裝訪問權限總結struct和class的區別 將成員變量設置為private C和C中struct區別 C語言struct只有變量C語言struct 既有變量&#xff0c;也有函數 類的封裝 封裝 把變量&#xff08;屬性&#xff09;和函數&#xff08;操作&a…

交換機部分綜合實驗

實驗要求 1.內網IP地址使用172.16.0.0/16 2.sw1和sW2之間互為備份; 3.VRRP/mstp/vlan/eth-trunk均使用; 4.所有pc均通過DHcP獲取Ip地址; 5.ISP只配置IP地址; 6.所有電腦可以正常訪問IsP路由器環回 實驗拓撲 實驗思路 1.給交換機創建vlan&#xff0c;并將接口劃入vlan 2.在SW1和…

Unity Render Streaming 云渲染 外網訪問

初版&#xff1a; 日期&#xff1a;2024.5.20 前言&#xff1a;臨時思路整理&#xff0c;后期會詳細補充 環境&#xff1a; 1. 阿里云服務器 需要安裝好nodejs 、npm 2. windows電腦&#xff0c;需安裝好 nodejs 、npm 3.Unity 2021.3.15f1 4.Unity Render Streaming …

31.GDB介紹及簡單使用

文章目錄 基本用法查看匯編代碼Text User Interface(TUI)refernece 歡迎訪問個人網絡日志&#x1f339;&#x1f339;知行空間&#x1f339;&#x1f339; GDB 是 GNU Debugger的縮寫&#xff0c;是GNU軟件系統中的標準調試器&#xff0c; 很多類UNIX系統都可以使用GDB&#xf…

【論文解讀】Overview of the Scalable Video Coding Extension of the H.264/AVC Standard

介紹 該篇論文是一篇關于H.264/AVC標準可擴展視頻編碼(SVC)擴展的綜述論文,由Heiko Schwarz、Detlev Marpe和Thomas Wiegand撰寫,發表在《IEEE Transactions on Circuits and Systems for Video Technology》2007年9月第17卷第9期上。 論文解讀 摘要: H.264/AVC視頻編…

鄉村振興的農業供給側結構性改革:優化農業產業結構,提升農產品質量,滿足市場需求,實現美麗鄉村產業振興

一、引言 鄉村振興戰略是我國當前及未來一段時間內的重大戰略部署&#xff0c;旨在推動農業農村現代化&#xff0c;實現城鄉融合發展。在鄉村振興戰略中&#xff0c;農業供給側結構性改革是核心任務之一。通過優化農業產業結構、提升農產品質量、滿足市場需求&#xff0c;不僅…