当前位置: 首页 > news >正文

JAVA两个线程交替打印实现

方案1 Semaphore 机制

通过信息号机制来 协调两个线程,一个线程打印后,给另一个线程释放一个信号量

  Semaphore semaphorea = new Semaphore(1);Semaphore semaphoreb = new Semaphore(0);Thread threada = new Thread(new Runnable() {@Overridepublic void run() {for (int i = 0; i < 50; i++) {try {semaphorea.acquire();} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println("a");semaphoreb.release();}}});Thread threadb = new Thread(new Runnable() {@Overridepublic void run() {for (int i = 0; i < 50; i++) {try {semaphoreb.acquire();} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println("b");semaphorea.release();}}});threada.start();threadb.start();

方案2

通过锁的condition来两个线程协作

public class AlternatePrintAB {private static boolean printA = true; // 初始化为true,用于控制打印的起始public static void main(String[] args) {Lock lock = new ReentrantLock();Condition conditiona = lock.newCondition();Condition conditionb = lock.newCondition();Thread thread = new Thread(new Runnable() {@Overridepublic void run() {for (int i = 0; i < 10; i++) {try {lock.lock();while (!printA) {try {//不打印A时,A等待conditiona.await();//await 会释放锁,唤醒时,要重新获取锁} catch (InterruptedException e) {e.printStackTrace();}}System.out.println("A");printA = false;conditionb.signal();} catch (Exception e) {throw new RuntimeException(e);} finally {lock.unlock();}}}});Thread thread1 = new Thread(new Runnable() {@Overridepublic void run() {for (int i = 0; i < 10; i++) {lock.lock();while (printA) {try {//打印A时,B等待conditionb.await();} catch (InterruptedException e) {e.printStackTrace();}}System.out.println("B");printA = true;conditiona.signal();}}});thread.start();thread1.start();}}
http://www.lryc.cn/news/342601.html

相关文章:

  • 【C语言】学习C语言
  • C 深入指针(2)
  • FileLink跨网文件交换,推动企业高效协作|半导体行业解决方案
  • 代码随想录day56 | 动态规划P16 | ● 583. ● 72. ● 编辑距离总结篇
  • ASP.NET网络在线考试系统
  • 天锐绿盾 | 办公加密系统,源代码防泄密、源代码透明加密、防止开发部门人员泄露源码
  • Day1| Java基础 | 1 面向对象特性
  • Spring 事务失效的几种情况
  • 【Linux 命令操作】如何在 Linux 中使用多行注释呢?
  • 【RPC】Dubbo接口测试
  • PVZ2 植物克僵尸【第二期】
  • libcity笔记:libcity/data/batch.py
  • 【Java EE】多线程(二)Thread 类与常用方法
  • AGV无人叉车 | 我们为什么要投资“智慧生产”
  • 【C++】滑动窗口:将x减到0的最小操作数
  • 运动控制“MC_MoveVelocity“功能块详细应用介绍
  • 9种单片机常用的软件架构
  • PyQt5中重要的概念:信号与槽
  • MacOS快速安装FFmpeg,并使用FFmpeg转换视频
  • docker部署nginx并配置https
  • 五一小长假,景区智慧公厕发挥了那些作用?
  • Spring - 9 ( 10000 字 Spring 入门级教程 )
  • shpfile转GeoJSON;控制shp转GeoJSON的精度;如何获取GeoJSON;GeoJSON是什么有什么用;GeoJSON结构详解(带数据示例)
  • 没有强有力的科技支撑,就没有保密工作的高质量发展。新修订的《中华人民共和国保守国家秘密法》在总则中新增保密科技创新有关内容包括()
  • 【快速入门】数据库的增删改查与结构讲解
  • 使用AIGC生成软件类图表
  • 机器学习实践:超市商品购买关联规则分析
  • 自动化图像识别:提高效率和准确性的新途径
  • 根据最近拒包项目总结,详细讲解Google最新政策(上)
  • 【Qt之OpenGL】01创建OpenGL窗口