[java] 控制三個線程按順序交替輸出數字123123…

控制三個線程按順序交替輸出數字123123…

synchronized(配合專用鎖對象)

通過共享鎖和 volatile 變量控制執行順序,每個線程按指定順序打印指定內容,確保輸出序列如 “123123…”。使用 synchronizedwait/notifyAll 實現線程間協作。

/*** AlternateOutput類用于實現三個線程交替輸出數字的功能* 通過使用synchronized關鍵字和wait/notify機制,確保三個線程按照1->2->3的順序循環輸出*/
public class AlternateOutput {/*** 用于線程同步的鎖對象*/private static final Object lock = new Object();/*** 當前應該執行的線程編號*/private static int currentThreadNum = 1;/*** 每個線程需要執行的循環次數*/private static final int MAX_LOOP = 10;/*** 線程執行的任務方法,負責按照指定順序輸出內容* @param curThreadNum 當前線程的編號,用于判斷是否輪到當前線程執行* @param nextThreadNum 下一個應該執行的線程編號,執行完當前任務后更新此值* @param output 當前線程需要輸出的內容*/private static void runTask(int curThreadNum, int nextThreadNum, String output) {// 循環執行指定次數的任務for (int i = 0; i < AlternateOutput.MAX_LOOP; i++) {// 使用synchronized塊確保線程安全synchronized (lock) {// 等待直到輪到當前線程執行while (AlternateOutput.currentThreadNum != curThreadNum) {try {lock.wait();} catch (InterruptedException e) {Thread.currentThread().interrupt();return;}}// 輸出當前線程的內容System.out.print(output);// 更新下一個應該執行的線程編號currentThreadNum = nextThreadNum;// 喚醒所有等待的線程lock.notifyAll();}}}/*** 程序入口點,創建并啟動三個線程實現交替輸出* @param args 命令行參數*/public static void main(String[] args) {// 創建第一個線程,負責輸出"1"Thread t1 = new Thread(() -> {runTask(1, 2, "1");});t1.start();// 創建第二個線程,負責輸出"2"Thread t2 = new Thread(() -> {runTask(2, 3, "2");});t2.start();// 創建第三個線程,負責輸出"3"Thread t3 = new Thread(() -> {runTask(3, 1, "3");});t3.start();// 等待所有線程執行完成try {t1.join();t2.join();t3.join();} catch (InterruptedException e) {Thread.currentThread().interrupt();}}
}

ReentrantLock和Condition

通過ReentrantLockCondition控制執行順序,確保按1→2→3循環打印10次。每個線程等待其編號輪次,執行打印后喚醒下一個線程。

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;public class PrintNumber {public static final int MAX_LOOP = 10;public static int currentNum = 1;public static final ReentrantLock lock = new ReentrantLock();public static final Condition c1 = lock.newCondition();public static final Condition c2 = lock.newCondition();public static final Condition c3 = lock.newCondition();public static void main(String[] args) {Thread t1 = new Thread(new PrintNumberTask(1));Thread t2 = new Thread(new PrintNumberTask(2));Thread t3 = new Thread(new PrintNumberTask(3));t1.start();t2.start();t3.start();}
}
import java.util.concurrent.locks.Condition;public class PrintNumberTask implements Runnable {private int number;public PrintNumberTask(int num) {this.number = num;}private void printAndSwith(String output, int nextNum, Condition awaitCondition, Condition signalCondition)throws InterruptedException {while (PrintNumber.currentNum != this.number) {awaitCondition.await();}System.out.print(output);PrintNumber.currentNum = nextNum;signalCondition.signal();}@Overridepublic void run() {for (int i = 0; i < PrintNumber.MAX_LOOP; i++) {PrintNumber.lock.lock();try {switch (number) {case 1:printAndSwith("1", 2, PrintNumber.c1, PrintNumber.c2);break;case 2:printAndSwith("2", 3, PrintNumber.c2, PrintNumber.c3);break;case 3:printAndSwith("3", 1, PrintNumber.c3, PrintNumber.c1);break;default:break;}} catch (Exception e) {e.printStackTrace();} finally {PrintNumber.lock.unlock();}}}
}

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

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

相關文章

[C#]winform基于yolov8-seg實現的指甲分割實現源碼

【測試環境】 vs2019 net framework4.7.2 onnxruntime1.16.3 opencvsharp 注意源碼運行在CPU上不支持GPU運行&#xff0c;由于net framework限制GPU會很慢因此沒有GPU版本提供。 【運行步驟】 打開sln項目 選擇x64 debug運行即可 如需要再x64 release運行可以將x64 debu…

數據結構——線性表(鏈表,力扣中等篇,增刪查改)

文章目錄一、增刪查改1.1增&#xff08;插入節點&#xff09;1.1.1兩數后插入公約數1.1.2循環有序鏈表的插入1.2刪&#xff08;移除節點&#xff09;1.2.1刪除已知的node節點【交換val值】1.2.2移除數組中已存在的節點【unordered_set】1.2.3刪除和為0的節點【前綴和】1.3改&am…

【Android】OkHttp發起GET請求 POST請求

三三要成為安卓糕手 一&#xff1a;OkHttp介紹 OkHttp 是一個開源的、強大且高效的 HTTP 客戶端庫&#xff0c;主要用于在 Java后端和Android 項目中進行網絡請求。 //在gradle中添加依賴 com.squareup.okhttp3:okhttp:4.12.0二&#xff1a;GET請求/*** 使用OkHttp發起get請求*…

[Mysql數據庫] 知識點總結8

1. 請詳細描述在復制拓撲中參與復制的線程類型以及各自所承擔的功能。答&#xff1a;當從屬服務器連接到主服務器時&#xff0c;在主服務器上會創建 Binlog 轉儲線程&#xff0c;在從屬服務器上會默 認創建 I/O 線程和 SQL 線程。- Binlog 轉儲線程用于從二進制日志讀取事件并將…

250829-Gitlab數據備份與恢復

下面給你一份可落地的遷移方案&#xff0c;保證 GitLab 的數據和配置完整遷移到服務器 B。你當前用的是 GitLab Omnibus&#xff08;docker 版&#xff09;&#xff0c;數據都在你映射的 3 個目錄里&#xff08;/etc/gitlab, /var/log/gitlab, /var/opt/gitlab&#xff09;&…

吳恩達機器學習作業十一:異常檢測

數據集在作業一異常檢測異常檢測就是發現與大部分對象不同的對象&#xff0c;其實就是發現離群點。異常檢測有時也稱偏差檢測。異常對象是相對罕見的。用數據集建立概率模型p ( x )&#xff0c;如果新的測試數據在這個模型上小于某個閾值&#xff0c;則說它極大可能為異常點算法…

2000w 的數據量,mysql要進行幾次IO操作,為什么

在 MySQL 中&#xff0c;2000 萬數據量的表在進行查詢時所需的 ??IO 操作次數??主要取決于 ??索引結構&#xff08;B樹層級&#xff09;??、??查詢類型??和 ??數據分布特征??。以下是具體分析&#xff1a;一、B樹層級與 IO 次數的關系InnoDB 引擎通過 B樹索引管…

【代碼隨想錄day 22】 力扣 39. 組合總和

視頻講解&#xff1a;https://www.bilibili.com/video/BV1KT4y1M7HJ/?vd_sourcea935eaede74a204ec74fd041b917810c 文檔講解&#xff1a;https://programmercarl.com/0039.%E7%BB%84%E5%90%88%E6%80%BB%E5%92%8C.html#%E6%80%9D%E8%B7%AF 力扣題目&#xff1a;https://leetcod…

DrissionPage 實戰:動態 IP 代理與百度翻譯 API 數據抓取

本文將詳細介紹如何使用 DrissionPage 實現動態 IP 代理訪問&#xff0c;并結合百度翻譯 API 進行數據抓取與處理。一、技術選型與架構設計1.1 為什么選擇 DrissionPage&#xff1f;DrissionPage 作為新一代網絡自動化工具&#xff0c;相比傳統 Selenium Requests 方案具有顯著…

策略模式:靈活應對算法動態切換

引言 在軟件開發中&#xff0c;我們常常會遇到需要在運行時動態選擇和切換算法或行為的場景。例如&#xff0c;電商系統中的多種支付方式、游戲中的不同難度設置&#xff0c;或是計算器中的各種運算符。傳統的方法可能會使用復雜的條件判斷語句&#xff08;如if-else或switch-c…

【C++ 】string類:深拷貝與淺拷貝解析

【C 】string類操作全解析-CSDN博客 1.stirng類的模擬實現 1.1 經典的string類問題 上面已經對string類進行了簡單的介紹&#xff0c;大家只要能夠正常使用即可。在面試中&#xff0c;面試官總喜歡要求自己來模擬實現string類&#xff0c;最主要是實現string類的構造、拷貝…

Decoder 解碼器

Decoder 解碼器&#xff1a; #include <stdio.h> #include <stdlib.h> #include <string.h>#include <libavformat/avformat.h> #include <libavcodec/avcodec.h> #include <libswscale/swscale.h>#define WORD uint16_t #define DWORD ui…

globals() 小技巧

scheduler_class globals()[scheduler_class_name] Python 中一種 動態獲取類對象 的常用技巧&#xff0c;屬于 反射&#xff08;reflection&#xff09; 編程的范疇globals()Python 內置函數&#xff0c;返回一個 字典&#xff08;dict&#xff09;&#xff0c;包含當前模塊&…

Android Studio 9.png制作

一、新建 二、把要做的圖png導入進去 png圖片建議 根據內容預留1像素可拉伸區域 eg:純色或可漸變底色 三、右邊創建.9.png 四、雙擊打開 1、繪制黑邊 參考視頻 2、縮放到800% ,移至右下 3、在下面和右邊繪制整根黑線 4、根據png 位置左側和上側黑線 4.1 分析 紅色方框為…

【百度】C++開發(25屆提前批 一面)面經

文章目錄1. 代碼實現&#xff1a;說說LRU&#xff0c;并代碼實現LRU為什么使用哈希表&#xff1f;&#xff08;有兩個原因&#xff09;1. 僅用雙向鏈表的缺陷2. 引入哈希表的作用1. 快速查找&#xff1a;2. 快速插入與刪除&#xff1a;雙向鏈表 哈希表的協作過程舉例說明代碼實…

Word文檔怎么打印?Word打印技巧?【圖文詳解】單面/雙面/指定頁面/逆序等Word打印選項

一、問題背景 在日常辦公、學習場景中&#xff0c;Word文檔作為常用的文字處理載體&#xff0c;經常需要將電子內容轉化為紙質版本&#xff0c;比如提交報告、打印學習資料、整理文檔存檔等。 但不少用戶在嘗試打印Word文檔時&#xff0c;常會遇到各種阻礙&#xff1a;有的不清…

漫談《數字圖像處理》之基函數與基圖像

在數字圖像處理領域&#xff0c;基函數與基圖像是貫穿理論分析與實際應用的核心概念 —— 它們如同 “樂高積木”&#xff0c;將復雜的圖像信號拆解為可解釋、可操作的基本單元&#xff0c;支撐起壓縮、去噪、特征提取等一系列關鍵任務。從傳統的傅里葉變換到前沿的因子場理論&…

打開多個Excel文件后快速關閉所有的文檔,并且退出Excel應用

打開多個Excel文件后如果要快速關閉所有的文檔&#xff0c;并且退出Excel應用&#xff0c;可以按住Shift鍵右上角的號&#xff08;關閉按鈕&#xff09;。Word和PowerPoint也是一樣的操作。如果有文檔修改后沒有保存&#xff0c;會提示是否保存。作為補充&#xff0c;先來看看兩…

基于 PyTorch 構建 Dataset 與 DataLoader:從 TXT 文件讀取到新增類別全流程指南

基于 PyTorch 構建 Dataset 與 DataLoader&#xff1a;從 TXT 文件讀取到新增類別全流程指南在深度學習計算機視覺任務中&#xff0c;數據加載與預處理是模型訓練的基礎環節&#xff0c;直接影響模型的訓練效率與最終性能。PyTorch 作為主流深度學習框架&#xff0c;提供了Data…

hive on tez如果是2個大表union會寫幾次臨時文件到hdfs目錄,數據量如何計算

如果是2個大表union會寫幾次臨時文件到hdfs目錄&#xff0c;數據量如何計算 在Hive on Tez中&#xff0c;兩個大表執行UNION操作時&#xff0c;臨時文件的寫入次數和數據量&#xff0c;取決于UNION的類型&#xff08;UNION ALL還是UNION去重&#xff09;以及執行計劃的Stage劃分…