Java面試題:三個線程交替打印ABC如何實現?

目錄

    • 方法一:使用synchronized和wait/notify
    • 方法二:使用`CompletableFuture`實現

方法一:使用synchronized和wait/notify

package com.demo;import java.util.concurrent.CompletableFuture;public class PrintABC {// 當前狀態private static String state = "A";// 共享鎖對象private static final Object lock = new Object();public static void main(String[] args) {Thread t1 = new Thread(() -> {synchronized (lock){System.out.println("current: A; state: " + state);// 等待while (!"A".equals(state)){try {lock.wait();} catch (InterruptedException e) {e.printStackTrace();}}System.out.println("A: " + Thread.currentThread());// 修改B狀態state = "B";// 喚醒下一個lock.notifyAll();}});Thread t2 = new Thread(() -> {synchronized (lock){System.out.println("current: B; state: " + state);// 等待while (!"B".equals(state)){try {lock.wait();} catch (InterruptedException e) {e.printStackTrace();}}System.out.println("B: " + Thread.currentThread());// 修改B狀態state = "C";// 喚醒下一個lock.notifyAll();}});Thread t3 = new Thread(() -> {synchronized (lock){System.out.println("current: C; state: " + state);// 等待while (!"C".equals(state)){try {lock.wait();} catch (InterruptedException e) {e.printStackTrace();}}System.out.println("C: " + Thread.currentThread());// 修改B狀態state = "";// 喚醒下一個lock.notifyAll();}});t1.start();t2.start();t3.start();}
}

輸出

current: A; state: A
A: Thread[Thread-0,5,main]
current: C; state: B
current: B; state: B
B: Thread[Thread-1,5,main]
C: Thread[Thread-2,5,main]

方法二:使用CompletableFuture實現

package com.demo;import java.util.concurrent.CompletableFuture;public class PrintABC {public static void main(String[] args) {CompletableFuture<Void> t1 = CompletableFuture.runAsync(() -> {System.out.println("A: " + Thread.currentThread());});CompletableFuture<Void> t2 = t1.thenRunAsync(() -> {System.out.println("B: " + Thread.currentThread());});t2.thenRunAsync(()->{System.out.println("C: " + Thread.currentThread());});}
}

輸出

A: Thread[ForkJoinPool.commonPool-worker-1,5,main]
B: Thread[ForkJoinPool.commonPool-worker-1,5,main]
C: Thread[ForkJoinPool.commonPool-worker-2,5,main]

參考

華為OD面試:三個線程交替打印ABC如何實現?
面試題:三個線程如何交替打印ABC100次

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

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

相關文章

數據結構 Java DS——鏈表部分經典題目 (1)

前言 筆者計劃在暑假啃完JavaDS,Mysql的內容當然也會繼續更 這次給讀者們分享的是鏈表的幾個比較典型的題目,關于如何手搓一個鏈表,筆者還在籌劃中, 畢竟鏈表的種類也有那么多,但是在下面的題目中,只有單向鏈表 題目一 : 反轉鏈表 206. 反轉鏈表 - 力扣&#xff08;LeetCode…

什么是 VueQuill(前端的富文本編輯器)?

什么是 VueQuill&#xff1f; 1. 簡介 VueQuill 是 Vue.js 的一個富文本編輯器插件&#xff0c;它基于 Quill 編輯器構建&#xff0c;提供了簡潔且功能強大的富文本編輯功能。Quill 是一個現代化的富文本編輯器&#xff0c;提供豐富的文本編輯能力&#xff0c;支持多種格式和…

paddlenlp cpu windows 下測試gpt

paddlenlp 安裝python3.11版本 conda create -n python311 python3.11 激活python conda activate python311 安裝paddlepaddle conda install paddlepaddle3.0.0b0 -c paddle pip install paddlenlp3.0.0b0 -U -i https://pypi.tuna.tsinghua.edu.cn/simple windows下…

RockYou2024 發布史上最大密碼憑證

參與 CTF 的每個人都至少使用過一次臭名昭著的rockyou.txt單詞表&#xff0c;主要是為了執行密碼破解活動。 該文件是一份包含1400 萬個唯一密碼的列表。 源自 2009 年的 RockYou 黑客攻擊&#xff0c;創造了計算機安全歷史。 多年來&#xff0c;“rockyou 系列”不斷發展。…

爬蟲怎么實現抓取的

1.4爬蟲工程師常用的庫通過圖1-3我們了解到&#xff0c;爬蟲程序的完整鏈條包括整理需求、分析目標、發出網絡請求、文本解析、數據入庫和數據出庫。其中與代碼緊密相關的有&#xff1a;發出網絡請求、文本解析、數據入庫和數據出庫&#xff0c;接下來我們將學習不同階段中爬蟲…

C++OCR API減輕人們文字錄入的負擔

曾幾何時&#xff0c;許多大企業會設立文字錄入專員的崗位。相信有不少人第一份實習工作就是錄入資料&#xff0c;文檔、發票、證件等形形色色的文件堆積如山&#xff0c;日積月累的敲擊鍵盤&#xff0c;一張一張的錄入電腦系統。這種工作是枯燥的&#xff0c;可以練就文字錄入…

實驗01 黑盒測試方法(等價類劃分、邊界值分析)

一 實驗目的&#xff1a; 1、理解黑盒測試的定義&#xff1b; 2、掌握等價類劃分法&#xff1b; 3、掌握邊界值分析法。 二 實驗環境 1、Windows操作系統計算機&#xff1b; 三 實驗準備 1、理解黑盒測試的定義&#xff1b; 2、等價類劃分法原則&#xff1b; 3、邊界值分…

Java反射與Fastjson的危險反序列化

什么是Java反射&#xff1f; 在前文中&#xff0c;我們有一行代碼 Computer macBookPro JSON.parseObject(preReceive,Computer.class); 這行代碼是什么意思呢&#xff1f;看起來好像就是我們聲明了一個名為 macBookPro 的 Computer 類&#xff0c;它由 fastjson 的 parseObje…

Java入門-Day7-面對對象基礎-構造器

&#xff08;1&#xff09;特點 創建對象時&#xff0c;對象會去調用構造器 &#xff08;2&#xff09;應用場景 創建對象時&#xff0c;同時完成對對象的成員變量&#xff08;屬性&#xff09;&#xff0c;的初始化 &#xff08;3&#xff09;注意事項 //Sutdent構造器 注…

Java 幼兒園(20240709)多來源列表映射多實現類

1、功能場景 對接多個外部廠商&#xff0c;比如多個銀行的賬單獲取&#xff0c;需要根據銀行信息執行對應的實現類。 2、功能代碼 &#xff08;1&#xff09;YAML配置來源列表 bank-source: bank_001, bank_002, bank_003 &#xff08;2&#xff09;外部來源枚舉 public …

《夢醒蝶飛:釋放Excel函數與公式的力量》10.2 COMPLEX函數

第二節 10.2 COMPLEX函數 10.2.1函數簡介 COMPLEX函數是Excel中的一個工程函數&#xff0c;用于將實部和虛部組合成一個復數。復數廣泛應用于工程、電氣、物理等領域&#xff0c;COMPLEX函數提供了方便的復數表示和計算方法。 10.2.2語法&#xff1a; COMPLEX(real_num, i_…

flex 填滿剩余空間

常見的flex屬性值&#xff1a; 1.flex:1,也就是flex-grow:1,也就是上面說的自動放大填充滿剩余空間&#xff0c;若有其他子盒子設置flex&#xff0c;則平分。 2.flex:0 0 auto,等同于flex:none,子元素的長度決定它的長度&#xff0c;當整體空間不足時&#xff0c;它也不會縮小&…

swift獲取app網絡和本地網絡權限

請求藍牙權限&#xff1a; //藍牙if #available(iOS 13.1, *) {let autostate CBManager.authorizationif(autostate .notDetermined){print("")self.manager CBCentralManager(delegate: nil, queue: DispatchQueue.main,options: [CBCentralManagerOptionShowPo…

JavaScript中的LHS和RHS

LHS和RHS之前我們先來回憶一下最簡單的賦值操作! var test100; console.log(test); 以上代碼的意思簡單我們理解為把右邊的值賦值給左邊的test變量,然后輸出打印結果。 可是我們要是深入理解你就會發現在這個過程當中&#xff0c;還發生了一些其他的事情 而這些事情就是今天…

C語言 printf函數緩沖機制

printf不立即打印到stdout的原因 printf函數使用了緩沖機制。當我們調用printf時,輸出通常不會立即顯示在屏幕上,而是先存儲在一個緩沖區中。這是為了提高I/O操作的效率。 緩存數據輸出的原理 stdio庫維護了一個緩沖區。當緩沖區滿了,或者在特定條件下,緩沖區的內容會被刷新…

前端如何讓網頁頁面完美適配不同大小和分辨率屏幕

推薦使用postcss插件&#xff0c;它會自動將項目所有的px單位統一轉換為vw等單位&#xff08;包括npm安裝的第三方組件&#xff09;&#xff0c;從而實現適配&#xff0c;具體配置規則可參考官網或npm網站介紹。 另外對于大屏的適配&#xff0c;需要縮放網頁&#xff0c;可使用…

歐姆龍安全PLC及周邊產品要點指南

電氣安全、自動化設備作業安全&#xff0c;向來是非常非常之重要的&#xff01;越來越多的客戶在規劃新產線、改造既有產線的過程中&#xff0c;明確要求設計方和施工方將安全考慮進整體方案中進行考慮和報價&#xff01;作為一名自動化電氣工程師&#xff0c;尤其是高級工程師…

養寵經驗分享貓咪經常掉毛怎么辦?最值得買的寵物空氣凈化器分享

身為資深鏟屎官&#xff0c;深知若偷懶不打掃&#xff0c;家中便成貓毛紛飛、異味繚繞的戰場&#xff0c;尤其換季時&#xff0c;更是雪上加霜。長期處于這樣的環境&#xff0c;不僅我們頭疼眼澀、咳嗽氣喘&#xff0c;對老人、小孩、孕婦等敏感群體更是健康大敵。 幸運的是&a…

Vagrant配合VirtualBox搭建虛擬機

目錄 前言一、軟件下載及安裝1.下載2.安裝擴展&#xff1a; 二、創建一個虛擬機1.Vagrant官方鏡像倉庫 三、使用遠程工具連接虛擬機1.修改相關配置文件 四、虛擬機克隆及使用1.通用配置2.簡單搭建一個java環境3.克隆虛擬機1.重命名虛擬機&#xff08;可選&#xff09;2.打包指定…

靶場練習 手把手教你通關DC系列 DC1

DC1靶場通關教程 文章目錄 DC1靶場通關教程前言一、信息收集1.主機存活2.端口收集3.網頁信息收集4.目錄收集4.1 Nikto4.2 Dirb 信息收集總結 二、漏洞發現與利用1. 發現2. 利用 三、FlagFlag1Flag2Flag3Flag4Flag5(提權) 前言 本次使用的kali機的IP地址為192.168.243.131 DC1的…