使用java实现三个线程循环打印A,B,C,并写出三种方式

方式一:使用wait()和notifyAll()

public class demo1 {private int n = 0;private int turn = 0;public static void main(String[] args) {new demo1().startThreads();}private void startThreads() {new Thread(() -> printLetter('A', 0), "线程1").start();new Thread(() -> printLetter('B', 1), "线程2").start();new Thread(() -> printLetter('C', 2), "线程3").start();}private synchronized void printLetter(char letter, int target) {while (n <= 100) {while (turn != target) {try {wait();} catch (InterruptedException e) {e.printStackTrace();}}if (count > 100) {System.exit(0);}System.out.println("第" + n++ + "个:" + letter);turn = (turn + 1) % 3;notifyAll();}}
}

方式二:使用Lock和Condition

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;public class demo2 {private int n = 0;private int turn = 0;private final Lock lock = new ReentrantLock();private final Condition condition = lock.newCondition();public static void main(String[] args) {new demo2().startThreads();}void startThreads() {new Thread(() -> printLetter('A', 0)).start();new Thread(() -> printLetter('B', 1)).start();new Thread(() -> printLetter('C', 2)).start();}private void printLetter(char letter, int target) {lock.lock();try {while (n <= 100) {while (turn != target) {condition.await();}if (n > 100) {System.exit(0);}System.out.println("第" + n++ + "个线程:" + letter);turn = (turn + 1) % 3;condition.signalAll();}} catch (InterruptedException e) {e.printStackTrace();} finally {lock.unlock();}}}

方式三:使用CyclicBarrier循环栅栏

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.atomic.AtomicInteger;public class demo3 {private final CyclicBarrier cyclicBarrier = new CyclicBarrier(3);private final AtomicInteger count = new AtomicInteger(0);private int turn = 0;public static void main(String[] args) {new demo3().startThreads();}private void startThreads() {new Thread(() -> printLetter('A', 0), "线程1").start();new Thread(() -> printLetter('B', 1), "线程2").start();new Thread(() -> printLetter('C', 2), "线程3").start();}private void printLetter(char letter, int target) {try {while (count.get() <= 100) {while (turn != target) {cyclicBarrier.await();}System.out.println("第" + count + "个线程:" + letter);if (count.getAndIncrement() == 100) {System.exit(0);}turn = (turn + 1) % 3;}} catch (BrokenBarrierException | InterruptedException e) {e.printStackTrace();}}
}

流程演示:

第一轮:

  1. turn=0,线程一符合条件,线程二await(),线程三await();
  2. 进行打印,count++,turn加1取3的余数,此时turn=1;
  3. 线程一await(),释放栅栏;

第二轮:

  1. turn=1,线程二符合条件,线程一await(),线程三await();
  2. 进行打印,count++,turn加1取3的余数,此时turn=2;
  3. 线程二await(),释放栅栏;

第三轮:

  1. turn=2,线程三符合条件,线程一await(),线程二await();
  2. 进行打印,count++,turn加1取3的余数,此时turn=0;
  3. 线程三await(),释放栅栏;

循环至count=100......

ps:以下是我整理的java面试资料,感兴趣的可以看看。最后,创作不易,觉得写得不错的可以点点关注!

链接:https://www.yuque.com/u39298356/uu4hxh?# 《Java面试宝典》 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/760342.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

抖音视频提取工具可导出视频分享链接|视频爬虫批量下载

抖音无水印视频批量下载工具操作指南 一、工具介绍 我们开发了一款功能强大的视频批量下载工具&#xff0c;不仅能够通过单个视频链接进行提取&#xff0c;还可以通过关键词进行视频搜索&#xff0c;Q:290615413实现批量提取和有选择性的下载。 二、操作步骤 2.1 关键词批量…

IO网络通信

IO Bio&#xff1a; 同步阻塞&#xff0c;一个线程一次连接&#xff0c;基于字符流/字节流 Nio&#xff1a;同步非阻塞 一个线程多个连接&#xff0c;多个请求注册到多路复用selector上&#xff0c;多路复用器轮训连接 面向缓冲区&#xff0c; 从某通道读取数据到缓存区&…

Android:adb命令

执行adb命令的窗口如下 Mac或Linux系统里的终端窗口&#xff1b; window系统运行输入cmd打开的指令窗口&#xff1b; Android Studio 里控制下面的Terminal窗口 1. 查看已链接的设备和模拟器 adb devices -l 2. 查看Android内核版本号 adb shell getprop ro.build.version.re…

数据结构和算法:哈希表

哈希表 哈希表&#xff08;hash table&#xff09;&#xff0c;又称散列表&#xff0c;它通过建立键 key 与值 value 之间的映射&#xff0c;实现高效的元素查询。具体而言&#xff0c;向哈希表中输入一个键 key &#xff0c;则可以在 &#x1d442;(1) 时间内获取对应的值 va…

CSS样式表 样式优先级 选择器以及选择器的权重优先级

CSS组成 css由选择符和声明组成&#xff0c;声明又分为属性和属性值 属性必须放在花括号里面&#xff0c;属性与属性值必用冒号连接 每条声明用分号结束 当一个属性有多个属性值的时候&#xff0c;属性值与属性值部分先后顺序&#xff0c;用空格隔开 在书写样式过程中、空格、换…

C++ 设计模式:观察者模式

观察者模式是行为模式之一&#xff0c;它的一个对象的状态发生变化时能自动通知其它关联对象&#xff0c;自动刷新对象状态。 Qt中信号/槽函数机制就是观察者模式&#xff0c;信号只用进行函数声明&#xff0c;槽函数的参数要和信号的参数一致&#xff0c;这是因为编译器通过co…

软文营销塑造品牌形象,迅推客助力企业成功求发展

企业可以选择适合自身的新闻宣传方法。迅推客作为互联网整合营销机构&#xff0c;积极推动软文营销&#xff0c;助力企业塑造高端品牌形象。 1、新闻稿战略规划。 新闻宣传前要有明确的战略规划。在新闻稿的创作过程中&#xff0c;企业的需求与消费者的需求巧妙地融合在一起。…

JAVA学习-NIO.字符集和Charset

在Java NIO中&#xff0c;字符集&#xff08;Character Set&#xff09;用于将字符与字节之间进行编码和解码。Java NIO提供了Charset类来表示字符集&#xff0c;并且支持多种常用的字符集。 一、Java NIO中常用的字符集包括但不限于以下几种&#xff1a; 1. UTF-8&#xff1…

如何查看 MySQL 数据库中某张指定表的具体大小

显示表的数据和索引占用的空间总量&#xff0c;您可以执行以下查询。(即查看 MySQL 数据库中某张指定表的具体大小&#xff09; SELECT table_name AS Table, ROUND(((data_length index_length) / 1024 / 1024), 2) AS Size (MB) FROM information_schema.TABLES WHERE ta…

室内3D模型选择指南:哪家更值得信赖?

如今室内设计的3D模型已经成为了一种重要的设计工具。它们能够帮助设计师们更好地向客户展示他们的设计想法&#xff0c;同时也让客户能够更直观地理解他们的需求。然而&#xff0c;面对市场上众多的室内3D模型网站&#xff0c;我们该如何选择呢? 室内3D模型选择指南&#xff…

【代码随想录算法训练营第二十九天 | LeetCode491.递增子序列、46.全排列、47.全排列 II】

代码随想录算法训练营第二十九天 | LeetCode491.递增子序列、46.全排列、47.全排列 II 一、491.递增子序列 解题代码C&#xff1a; class Solution { private:vector<vector<int>> result;vector<int> path;void backtracking(vector<int>& nums…

构建高效Web应用程序:深入理解与实践RESTful API

I. 引言 A. Web应用程序开发的演变 随着互联网的迅速发展&#xff0c;Web应用程序开发也经历了巨大的变革。从最初的静态页面到动态网页&#xff0c;再到如今的复杂Web应用程序&#xff0c;这一演变过程中&#xff0c;开发者们不断寻求更高效、更灵活的解决方案&#xff0c;以…

echarts系列:echarts增加loading

背景 最近在大屏项目研发时&#xff0c;存在多个echarts图表&#xff0c;有些接口获取数据较慢&#xff0c;需要加loading样式&#xff1b; 解决方案 翻阅api&#xff0c;找到showLoading可进行设置 参考&#xff1a; 加载动画效果 显示加载动画效果。可以在加载数据前手动…

shader学习记录——几何着色器

参考连接&#xff1a; 几何着色器基础知识 模型沙砾化 Shader "Custom/geomShader" {Properties{_MainTex("Texture", 2D) "white" {}_Speed("Speed", Float) 10_AccelerationValue("AccelerationValue", Float) 10}Sub…

文件操作:二进制文件(写/读)

以二进制的方式对文件进行读写操作其打开方式要指定为 ios::binary 二进制方式写文件主要利用流对象调用成员函数write 函数原型 &#xff1a; ostream& write(const char * buffer,int len); 参数解释&#xff1a;字符指针buffer指向内存中一段存储空间。len是读写的字…

C# 中 判断指定2条线是否相交、重合等功能

调用代码&#xff1a; var line1Start new System.Windows.Point(line4.Syjd_X_BasicGeometry, line4.Syjd_Y_BasicGeometry); var line1End new System.Windows.Point(line4.Xyjd_X_BasicGeometry, line4.Xyjd_Y_BasicGeometry); …

10个优秀的Github开源项目

1Panel 是一个现代化、开源的 Linux 服务器运维管理面板 EX-chatGPT-精准搜索工具 feishu-chatgpt-飞一般的工作体验工具 Knife4j-是一个集Swagger2 和 OpenAPI3为一体的增强解决方案 Kooder 是 Gitee 团队开发的一个代码搜索系统 mtbird 是一款低代码可视化页面生成器 S…

docker一键部署若依前后端分离版本

比如这里把文件放到/xin/docker/jiaoZ/的目录下&#xff0c;jar包和下面的配置文件都放在这个文件夹下。 注意要把jar端口改为你实际启动的&#xff0c;映射端口也可以改为你想要的。 这里的映射端口为&#xff1a;nginx监听80端口&#xff0c;jar在8620端口&#xff0c;mysq…

邮箱的正则表达式

一、 背景 项目中要给用户发送邮件&#xff0c;这时候需要校验用户输入的邮箱的有有效性&#xff0c;这肯定用正则呀。 虽然没有统一的邮箱账号格式&#xff0c;但是所有邮箱都符合“名称域名”的规律。对于名称和域名的字符限制&#xff0c;我们可以根据项目的情况定义一个&a…

Emotion Prompt-LLM能够理解并能通过情感刺激得以增强

Large Language Models Understand and Can be Enhanced by Emotional Stimuli 情感智能对我们的日常行为和互动产生了显著的影响。尽管大型语言模型&#xff08;LLMs&#xff09;被视为向人工通用智能迈进的一大步&#xff0c;在许多任务中表现出色&#xff0c;但目前尚不清楚…