最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java實現(xiàn)三個線程進行順序打印的兩種方案

 更新時間:2026年01月04日 09:47:17   作者:Chen不舊  
三個線程按順序打印是一個經(jīng)典的并發(fā)編程面試題,通常要求線程 A 打印 1,線程 B 打印 2,線程 C 打印 3,然后循環(huán)往復,所以本文給大家介紹了Java實現(xiàn)三個線程進行順序打印的兩種方案的相關(guān)資料,需要的朋友可以參考下

引言

“三個線程按順序打印”是一個經(jīng)典的并發(fā)編程面試題,通常要求線程 A 打印 1,線程 B 打印 2,線程 C 打印 3,然后循環(huán)往復。

實現(xiàn)這個邏輯的核心在于線程間的通信(Signaling)。我們可以使用 Java 的 synchronized 配合 wait/notify,或者更現(xiàn)代的 ReentrantLock 配合 Condition。

方案一:使用ReentrantLock和Condition(推薦)

這是最清晰的方案。我們?yōu)槊總€線程創(chuàng)建一個“信號燈”(Condition),手動控制喚醒哪一個。

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class SequencePrint {
    private final Lock lock = new ReentrantLock();
    private final Condition cond1 = lock.newCondition();
    private final Condition cond2 = lock.newCondition();
    private final Condition cond3 = lock.newCondition();
    private int state = 1; // 當前應(yīng)該打印的序號

    public void print(String name, int targetState, Condition current, Condition next) {
        for (int i = 0; i < 10; i++) { // 假設(shè)打印10輪
            lock.lock();
            try {
                // 如果還沒輪到我,就一直等著
                while (state != targetState) {
                    current.await();
                }
                System.out.print(name + " ");
                // 修改狀態(tài)并喚醒下一個線程
                state = (targetState % 3) + 1;
                next.signal();
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            } finally {
                lock.unlock();
            }
        }
    }

    public static void main(String[] args) {
        SequencePrint sp = new SequencePrint();
        new Thread(() -> sp.print("A", 1, sp.cond1, sp.cond2)).start();
        new Thread(() -> sp.print("B", 2, sp.cond2, sp.cond3)).start();
        new Thread(() -> sp.print("C", 3, sp.cond3, sp.cond1)).start();
    }
}

方案二:使用synchronized和wait/notifyAll(最基礎(chǔ))

這種方式代碼最少,但效率略低,因為 notifyAll() 會喚醒所有等待線程,不滿足條件的線程會被喚醒后再次檢查并掛起。

public class WaitNotifyPrint {
    private int state = 1;
    private final Object lock = new Object();

    public void print(String name, int targetState) {
        for (int i = 0; i < 10; i++) {
            synchronized (lock) {
                while (state != targetState) {
                    try { lock.wait(); } catch (InterruptedException e) {}
                }
                System.out.print(name);
                state = (state % 3) + 1;
                lock.notifyAll(); // 喚醒所有人,讓他們競爭判斷 state
            }
        }
    }

    public static void main(String[] args) {
        WaitNotifyPrint wnp = new WaitNotifyPrint();
        new Thread(() -> wnp.print("A", 1)).start();
        new Thread(() -> wnp.print("B", 2)).start();
        new Thread(() -> wnp.print("C", 3)).start();
    }
}

到此這篇關(guān)于Java實現(xiàn)三個線程進行順序打印的兩種方案的文章就介紹到這了,更多相關(guān)Java三個線程順序打印內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java中多個@Scheduled定時器不執(zhí)行的解決方法

    java中多個@Scheduled定時器不執(zhí)行的解決方法

    在應(yīng)用開發(fā)中經(jīng)常需要一些周期性的操作,比如每5分鐘執(zhí)行某一操作等,這篇文章主要給大家介紹了關(guān)于java中多個@Scheduled定時器不執(zhí)行的解決方法,需要的朋友可以參考下
    2023-04-04
  • SpringBoot配置Https訪問的詳細步驟

    SpringBoot配置Https訪問的詳細步驟

    HTTP(Hypertext transfer protocal)是一種詳細規(guī)定了瀏覽器和萬維網(wǎng)服務(wù)器之間相互通信的規(guī)則,通過因特網(wǎng)傳送萬維網(wǎng)文檔的數(shù)據(jù)傳送協(xié)議,這篇文章主要介紹了SpringBoot配置Https訪問的詳細步驟,需要的朋友可以參考下
    2024-02-02
  • mybatisPlus更新字段值為null的解決方案

    mybatisPlus更新字段值為null的解決方案

    在使用mybatis-plus時,發(fā)現(xiàn)當前端傳入的值為null值時,結(jié)果無論怎么操作后端都不執(zhí)行更新null字段的操作,下面這篇文章主要給大家介紹了關(guān)于mybatisPlus更新字段值為null的解決方案,需要的朋友可以參考下
    2023-04-04
  • 分享一個你不知道的Java異常實現(xiàn)的缺陷

    分享一個你不知道的Java異常實現(xiàn)的缺陷

    Java中一個大家熟知的知識點就是異常捕獲,try...catch...finally組合,但是很多人不知道這里面有一個關(guān)于Java的缺陷,或者說是異常實現(xiàn)的一點不足之處。本文就通過一個很簡單的實驗給大家演示下效果玩玩兒,希望大家能覺得有趣
    2022-12-12
  • Java使用帶標簽的break語句跳出多層循環(huán)

    Java使用帶標簽的break語句跳出多層循環(huán)

    本文介紹了Java中的帶標簽的break語句,它允許跳出指定的外層循環(huán),適用于多層嵌套循環(huán)場景,通過示例解釋了如何在方法中優(yōu)雅地跳出多層循環(huán)而不會影響方法其余邏輯,實際應(yīng)用場景如檢測圖像是否為黑屏,總結(jié)了標簽的使用注意事項和替代方案,需要的朋友可以參考下
    2026-05-05
  • Springboot-Management的項目實踐

    Springboot-Management的項目實踐

    本文主要介紹了Springboot-Management的項目實踐,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-05-05
  • java加密枝術(shù)深入理解

    java加密枝術(shù)深入理解

    java.security包中的MessageDigest類提供了計算消息摘要的方法,本文將詳細介紹,需要了解的朋友可以參考下
    2012-11-11
  • Java守護線程實例詳解_動力節(jié)點Java學院整理

    Java守護線程實例詳解_動力節(jié)點Java學院整理

    在Java中有兩類線程:User Thread(用戶線程)、Daemon Thread(守護線程) 。下面通過本文給大家分享java守護線程實例詳解,需要的朋友參考下吧
    2017-06-06
  • 使用Java調(diào)用Yolo模型的基本步驟

    使用Java調(diào)用Yolo模型的基本步驟

    Yolo(You Only Look Once)是一種基于深度學習的目標檢測算法,它可以在一張圖像中同時檢測出多個目標,并給出它們的位置和類別,這篇文章主要介紹了使用Java調(diào)用Yolo模型的基本步驟,需要的朋友可以參考下
    2024-03-03
  • Spring中的底層架構(gòu)核心概念類型轉(zhuǎn)換器詳解

    Spring中的底層架構(gòu)核心概念類型轉(zhuǎn)換器詳解

    這篇文章主要介紹了Spring中的底層架構(gòu)核心概念類型轉(zhuǎn)換器詳解,本文結(jié)合示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-12-12

最新評論

庆云县| 陇川县| 平舆县| 福州市| 临邑县| 黄大仙区| 惠安县| 隆德县| 岐山县| 辉县市| 温泉县| 拉萨市| 宝山区| 海丰县| 达日县| 镇坪县| 乡宁县| 靖江市| 兴宁市| 曲周县| 皮山县| 蕲春县| 太原市| 东丽区| 铜山县| 循化| 西林县| 尉犁县| 张家口市| 叶城县| 晋中市| 上林县| 广南县| 承德市| 肥西县| 宁武县| 开远市| 西吉县| 五华县| 香格里拉县| 南丰县|