線程通信機制

目錄

一、主線程與子線程基礎通信

1.1 主線程向子線程傳遞數據

二、子線程向主線程返回數據

2.1 通過共享變量方式

2.2 同步塊中使用wait/notify機制

2.3?Lock和Condition實現線程通信機制


一、主線程與子線程基礎通信

1.1 主線程向子線程傳遞數據

  • 通過構造函數傳遞參數:主線程通過UserThread的構造函數將數據a傳遞給子線程

package com.demo6;public class Test {public static void main(String[] args) {System.out.println(Thread.currentThread().getName()+",主線程");int  a  = 10;UserThread  u  = new UserThread(a);u.start();}
}
package com.demo6;public class UserThread  extends Thread{int  a  ;public UserThread(int a){this.a  = a;}public void  run(){System.out.println(Thread.currentThread().getName()+",執行run方法"+",a的值為:"+a);}}
  • 輸出結果:主線程創建子線程后,子線程輸出接收到的參數值

二、子線程向主線程返回數據

2.1 通過共享變量方式

  • sleep等待:主線程通過sleep等待子線程完成計算

  • 共享變量:子線程將計算結果存儲在成員變量中,主線程通過getter方法獲取

  • 缺點:sleep時間難以精確控制,可能等待過長或過短

package com.demo7;public class Test {public static void main(String[] args) {UserThread ut  =new UserThread();ut.start();try {Thread.sleep(5*1000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}System.out.println("主線程通過getter方法獲取的值為: "+ut.getSum());}}
package com.demo7;public class UserThread   extends Thread{private int sum = 0;public void  run(){for(int i=0;i<=100;i++){this.sum +=i;}}public int  getSum(){return this.sum;}}

運行結果:

2.2 同步塊中使用wait/notify機制

  • 同步協作:主線程和子線程使用同一個對象鎖進行同步

  • wait/notify機制:主線程等待,子線程完成后通知主線程

(1)當主線程持有的是當前線程類對象的鎖,如果是當前線程類對象的自己this和父類(Object/Thread.class/接口父類.class),都可以通知解鎖。?都可以顯示的或隱式的寫notify。

package com.demo13;public class Test {public static void main(String[] args) {UserThread u = new UserThread();u.start();//線程通信的必須的條件是:同一個對象//如果持有的是當前線程類對象的鎖,如果是當前線程類對象的自己this和父類,都可以通知解鎖//都可以顯示的或隱式的寫notifysynchronized (u) {try {//主線程持有u對象的鎖,被阻塞u.wait();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}System.out.println("主線程獲取的值為:"+u.getSum());}}}
package com.demo13;public class UserThread   extends Thread  implements IUser{private int  sum = 0;Object  obj  = new Object();public void run(){//		synchronized (this) {
//			for(int i=0;i<=100; i++)
//			{
//				sum+=i;
//			}
//		this.notify();
//		}//		synchronized (Thread.class) {
//			for(int i=0;i<=100; i++)
//			{
//				sum+=i;
//			}
//		}//		synchronized (obj) {
//			for(int i=0;i<=100; i++)
//			{
//				sum+=i;
//			}
//		}synchronized (IUser.class) {for(int i=0;i<=100; i++){sum+=i;}}}public  int getSum(){return this.sum;}}
package com.demo13;public interface IUser {}

運行結果:

(2)當主線程持有的是非線程類對象的鎖,子線程持有的也只能是非線程類對象的鎖。這是只能顯示的寫notify。

package com.demo13;public class Test {public static void main(String[] args) {User  u1  =  new User();UserThread   u = new UserThread(u1);u.start();synchronized (u1) {try {//主線程持有u1對象的鎖,內阻塞u1.wait();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}System.out.println("主線程獲取的值為:"+u.getSum());}}}
package com.demo13;public class UserThread   extends Thread  implements IUser{private int  sum = 0;User  u1;public UserThread(User u1) {this.u1 = u1;}public void run(){synchronized (u1) {for(int i=0;i<=100; i++){sum+=i;}//顯示解鎖u1.notify();}}public  int getSum(){return this.sum;}}
package com.demo13;public class User {}

運行結果:

如果子線程又new了User類對象u1,此時主線程和子線程的u1不是同一個對象,會發生死鎖:

2.3?Lock和Condition實現線程通信機制

????????這是一種基于明鎖(Lock)和條件變量(Condition)的線程通信機制,屬于JUC包中的高級同步機制。

? ? ?工作流程:

  1. 創建鎖和條件:主線程創建ReentrantLock和Condition對象

  2. 傳遞資源:將鎖和條件傳遞給子線程

  3. 主線程等待:主線程獲取鎖后調用cond.await()進入等待狀態

  4. 子線程執行:子線程獲取鎖,執行計算任務

  5. 發送信號:子線程完成任務后調用cond.signal()喚醒主線程

  6. 結果獲取:主線程被喚醒后獲取并輸出計算結果

package com.demo31;import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;public class Test {public static void main(String[] args) {Lock  lock  = new ReentrantLock();// 通過鎖創建條件變量Condition cond  =lock.newCondition();UserThread  u1  =  new UserThread(lock,cond);u1.start();lock.lock();try {// 主線程等待條件信號cond.await();// 收到信號后輸出計算結果System.out.println(u1.getSum());} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}// 手動釋放鎖lock.unlock();}}
package com.demo31;import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;public class UserThread extends Thread {private Lock lock;private int sum;private Condition cond;public UserThread(Lock lock,Condition cond) {this.lock = lock;this.cond  =cond;}public void run() {lock.lock();for (int i = 0; i <= 100; i++) {try {Thread.sleep(200);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}this.sum += i;}// 發送條件信號,喚醒等待的線程this.cond.signal();// 釋放鎖this.lock.unlock();}public  int getSum(){return  this.sum;}}

運行結果:

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

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

相關文章

硬盤 (FOREIGN) Slot:Unconfigured Bad

IBM 服務器硬盤故障&#xff0c;在webbios里看到有顯示&#xff08;Foreign&#xff09;Slot:xxxx, Unconfigured Bad的硬盤&#xff0c;選中該硬盤進入屬性頁面在屬性列表中找到“Media Error”和“Pred Fail Count”兩項&#xff08;如果找不到請點擊【Next】翻頁&#xff09…

Vite 環境變量與全局變量詳解

目錄 一、什么是環境變量&#xff1f; 二、Vite 的環境變量機制 1. .env 文件 2. 定義環境變量 3. 使用環境變量 4. 內置環境變量 三、Vite 中的全局變量 1. 使用 define 配置 2. 使用 TypeScript 聲明 四、環境變量 vs 全局變量 五、常見問題與坑點 1. 為什么必須…

華為S5720交換機配置教程:開啟Web管理功能

華為S5720交換機Web登錄配置指南 華為S5720系列交換機支持通過Web界面進行管理&#xff0c;這是一種圖形化的操作方式&#xff0c;比命令行更直觀易用。以下是配置S5720交換機開啟Web登錄的詳細步驟。 一、準備工作 連接設備&#xff1a;使用Console線連接交換機的Console…

插入排序及希爾排序

插入排序是一種十分簡單有效的排序算法&#xff0c;其基本思想就是將每一個待排序的數據按照關鍵字大小插入前邊已經排好序的子序列之中。 文章目錄最基本的插入排序折半插入排序希爾排序 最基本的插入排序 插入排序的基本思想如圖可以看出&#xff0c;不斷選中數組中的元素&am…

碼農必備!本地調試神器act,GitHub Actions最佳拍檔

引言 在現代軟件開發實踐中&#xff0c;持續集成和持續部署(CI/CD)已成為不可或缺的環節。GitHub Actions 作為 GitHub 官方提供的 CI/CD 解決方案&#xff0c;憑借其與代碼倉庫的深度集成和豐富的生態系統&#xff0c;獲得了廣大開發者的青睞。然而&#xff0c;每次修改 CI/C…

大模型本地部署與API服務教程

大模型本地部署與API服務教程 目標&#xff1a;在Ubuntu服務器部署本地大模型&#xff0c;并提供API服務&#xff0c;支持局域網下的Windows客戶端調用。 支持兩種部署方式&#xff1a;① 自建FastAPI服務&#xff08;高定制&#xff09; ② 使用Ollama&#xff08;極簡快速&am…

亞馬遜美加站點物流新規解讀:庫存處理邏輯重構與賣家應對策略

2025年9月&#xff0c;亞馬遜美國與加拿大站點即將實施物流計劃強制調整&#xff0c;批量清貨與捐贈計劃的規則迭代&#xff0c;標志著平臺對庫存生命周期管理的重視程度提升&#xff0c;此次新規以“可持續發展”為核心導向&#xff0c;通過強制與默認參與的雙重機制&#xff…

SpringBoot Web 入門指南:從零搭建第一個SpringBoot程序

SpringBoot Web 入門指南&#xff1a;從零搭建第一個SpringBoot程序SpringBoot Web 入門指南&#xff1a;從零搭建第一個SpringBoot程序一、Web開發基礎&#xff1a;靜態/動態資源與B/S、C/S架構解析?資源類型系統架構二、Spring 與 Spring Boot 核心介紹1. Spring 框架2. Spr…

從圖靈完備性到現實差距:為什么你的設備和你本人都潛力無限,卻表現各異?

理論上的無限潛力&#xff0c;為何被困在現實的牢籠中&#xff1f;一、引言&#xff1a;一個反直覺的概念 在計算機科學中&#xff0c;圖靈完備性&#xff08;Turing Completeness&#xff09; 是衡量一個系統計算能力的黃金標準。它得名于計算機科學之父艾倫圖靈&#xff08;A…

Android系統打通HAL層到應用層 --- Framework框架搭建

本文是接續上文&#xff0c;針對于HAL層的接口封裝Framework層的接口 HAL層框架搭建&#xff1a;https://blog.csdn.net/m0_50408097/article/details/151148637?spm1001.2014.3001.5502 在 Android 系統架構中&#xff0c;Framework 層&#xff08;框架層&#xff09; 位于 H…

LwIP入門實戰 — 2 LwIP概述

目錄 2.1 LwIP簡介 2.2 LwIP文件架構分析 2.2.1 LwIP軟件架構 2.2.2 主要模塊劃分 2.3 IPC通訊機制 2.4 LwIP的3種編程接口 2.4.1 RAW/Callback API 2.4.2 Netconn API 2.1 LwIP簡介 LWIP&#xff08;Light Weight Internet Protocol&#xff0c;輕型網絡協議棧&#…

微信小程序-day3

頁面導航跳轉聲明式導航注意&#xff1a;url開頭要有/1. 導航到 tabBar 頁面2. 導航到非 tabBar 頁面3. 后退導航編程式導航跳轉傳參參數可以在onLoad里用option獲取下拉刷新事件可在onPullDownRefresh中定義下拉事件對應操作在其中加入這個函數wx.stopPullDownRefresh()&#…

關于ES中文分詞器analysis-ik快速安裝

ES中文分詞器插件 安裝快速安裝手動安裝 應用ik_max_word 與 ik_smart 的區別驗證是否生效 官方地址&#xff1a;https://github.com/infinilabs/analysis-ik 安裝 快速安裝 插件安裝&#xff08;將鏈接最后的版本號換成當前ES版本號&#xff09;&#xff1a; bin/elastics…

STM32G4 電流環閉環

目錄一、STM32G4 電流環閉環1 電流環閉環PID控制2 電流環閉環建模附學習參考網址歡迎大家有問題評論交流 (* ^ ω ^)一、STM32G4 電流環閉環 1 電流環閉環 電流環框圖 PID控制 時域和拉普拉斯域的傳遞函數 PID&#xff1a; P比例部分&#xff0c;I積分部分&#xff0c;D微分…

利用 Java 爬蟲獲取淘寶商品詳情 API 接口

本文將詳細介紹如何使用 Java 編寫爬蟲程序&#xff0c;通過淘寶開放平臺的高級版 API 接口獲取商品的詳細信息。一、淘寶商品詳情 API 接口概述淘寶開放平臺提供了多個 API 接口用于獲取商品的詳細信息&#xff0c;其中 taobao.item.get 和 taobao.item.get_pro 是常用的接口。…

idea上傳本地項目代碼到Gitee倉庫教程

前言&#xff1a;本地一個項目代碼上傳到Gitee倉庫1.登錄Gitee官網新建倉庫&#xff08;命名跟項目同名&#xff09;2.idea添加Gitee插件&#xff08;需要Restart&#xff09;3.idea配置已安裝git的路徑4.idea添加Gitee賬戶5.給項目創建Git本地倉庫Git倉庫創建成功&#xff0c;…

往屆生還有機會進入計算機這個行業嗎?還能找見好工作嗎

前言 最近有很多的往屆生來咨詢我&#xff0c;問我還能找見工作嗎&#xff0c;還能進入這一行嗎&#xff08;大多數都是一些24屆&#xff0c;考研失敗的同學&#xff09; 針對目前這種情況&#xff0c;還能不能進&#xff0c;只能說很難&#xff0c;非常難。 在這里&#xff0c…

Python爬蟲實戰:研究 Lines, bars and markers 模塊,構建電商平臺數據采集和分析系統

1. 引言 1.1 研究背景 隨著互聯網技術的飛速發展,網絡上積累了海量的數據資源,這些數據蘊含著豐富的信息和價值。如何高效地獲取、處理和分析這些數據,成為信息時代面臨的重要課題。Python 作為一種功能強大的編程語言,憑借其豐富的庫支持和簡潔的語法,在網絡數據爬取和…

大文件穩定上傳:Spring Boot + MinIO 斷點續傳實踐

文章目錄一、引言&#xff1a;問題背景二、技術選型與項目架構三、核心設計與實現1. 初始化上傳 (/init)2. 上傳分塊 (/chunk)3. 完成上傳與合并 (/complete)4. 查詢上傳進度 (/progress)四、斷點續傳工作流程五、方案優勢總結六、拓展優化七、方案優勢對比一、引言&#xff1a…

表達式語言EL

表達式語言EL 1.EL表達式的作用 可以說&#xff0c;EL&#xff08;Expression Language&#xff09;表達式語言&#xff0c;就是用來替代<% %>的&#xff0c;EL比<%%>更簡潔&#xff0c;更方便。 2.與請求參數有關的內置對象 1.使用表達式&#xff1a;<%request…