Java面试题:三个线程交替打印ABC如何实现?

server/2024/9/23 3:19:23/

目录

    • 方法一:使用synchronized和wait/notify
    • 方法二:使用`CompletableFuture`实现

方法一:使用synchronized和wait/notify

java">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实现

java">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.ppmy.cn/server/59935.html

相关文章

【matlab】周期性信号分析

目录 信号预处理 周期性特征提取方法 频谱分析 傅里叶变换 快速傅里叶变换&#xff08;FFT&#xff09; 周期图法 Welch法 自相关分析 时频分析 基于模型的方法 时间序列分解 应用实例 提取信号的周期性特征是一个在信号处理领域广泛应用的技术&#xff0c;特别是在…

ThreeJS-3D教学十五:ShaderMaterial(noise、random)

ThreeJS-3D教学十四:ShaderMaterial(length、fract、step) 上面这篇主要是操作 fragmentShader 片元着色器,实现对物体颜色的修改,这次咱们来看下修改 vertexShader 顶点着色器,这个其实就是位移各个顶点的位置。 接下来我们先介绍下 noise 噪声函数(Perlin Noise、Sim…

Java面试题系列 - 第10天

题目&#xff1a;Java中的枚举类型&#xff08;enum&#xff09;及其高级应用 背景说明&#xff1a;Java中的枚举类型&#xff08;enum&#xff09;是一种特殊的类&#xff0c;用于定义一组固定的常量。枚举类型不仅限于提供常量集合&#xff0c;还可以实现接口、拥有方法和构…

昇思25天学习打卡营第19天|应用实践之基于MobileNetv2的垃圾分类

基本介绍 今天的应用实践是垃圾分类代码开发&#xff0c;整体流程是读取本地图像数据作为输入&#xff0c;对图像中的垃圾物体进行检测&#xff0c;并且将检测结果图片保存到文件中。采用的是MobileNetv2模型&#xff0c;使用官方提供的数据集&#xff0c;数据集分为4大类&…

设计模式:从HttpServletRequestWrapper了解装饰者模式

从一个参数处理的问题开始 为了满足安全测试&#xff0c;需要给系统追加防XSS注入的功能&#xff0c;关于此类安全的问题&#xff0c;一般的解决方案就是在请求到达Controller之前&#xff0c;使用Web框架的Filter或者Spring本身的拦截器对HttpServletRequest对象的参数进行处…

星环科技推出语料开发工具TCS,重塑语料管理与应用新纪元

5月30-31日&#xff0c;2024向星力未来数据技术峰会期间&#xff0c;星环科技推出一款创新的语料开发工具——星环语料开发工具TCS&#xff08;Transwarp Corpus Studio&#xff09;&#xff0c;旨在通过全面的语料生命周期管理&#xff0c;极大提升语料开发效率&#xff0c;助…

FastAPI 学习之路(四十八)WebSockets(四)接口测试

在我们测试的过程中&#xff0c;肯定会对接口进行测试。之前分享过的FastApi学习之路&#xff08;三十八&#xff09;对开发接口进行测试&#xff0c;那么我们针对websockets接口怎么测试呢。 其实也很简单 from fastapi.testclient import TestClient from main import appd…

【Docker系列】Docker 的基本概念和优势,以及在应用程序开发中的实际应用

Docker 是一种容器化平台&#xff0c;可以将应用程序及其依赖项打包到一个独立的容器中运行。Docker 的基本概念包括镜像、容器和仓库。 镜像是一个只读的文件&#xff0c;包含了运行应用程序所需的所有文件系统、库、环境变量等。容器是镜像的运行实例&#xff0c;它可以被启…