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

两个线程交替打印1-100

一、实现方案

  • 使用ReentrantLock
  • synchronized同步锁

二、ReentrantLock实现

public class Test {private static int maxCount = 100;private static volatile int num = 1;private static Lock lock = new ReentrantLock();private static Condition oddCondition = lock.newCondition();private static Condition evenCondition = lock.newCondition();public static void main(String[] args) {Thread oddThread = new Thread(() -> {printOdd();}, "OddThread");Thread evenThread = new Thread(() -> {printEven();}, "EvenThread");oddThread.start();evenThread.start();}private static void printOdd() {while (num <= maxCount) {try {lock.lock();if (num % 2 != 0) {System.out.println("printOdd " + num);num++;}evenCondition.signal();oddCondition.await();} catch (InterruptedException e) {e.printStackTrace();} finally {lock.unlock();}}}private static void printEven() {while (num <= maxCount) {try {lock.lock();if (num % 2 == 0) {System.out.println("printEven " + num);num++;}oddCondition.signal();evenCondition.await();} catch (InterruptedException e) {e.printStackTrace();} finally {lock.unlock();}}}
}

三、synchronized同步锁

public class Test {private static int maxCount = 100;private static int num = 1;private static Object lock = new Object();public static void main(String[] args) {Thread oddThread = new Thread(() -> {printOdd();}, "OddThread");Thread evenThread = new Thread(() -> {printEven();}, "EvenThread");oddThread.start();evenThread.start();}private static void printOdd() {while (num <= maxCount) {try {synchronized (lock) {if (num % 2 != 0) {System.out.println("printOdd " + num);num++;lock.notify();lock.wait();}}} catch (InterruptedException e) {e.printStackTrace();}}}private static void printEven() {while (num <= maxCount) {try {synchronized (lock) {if (num % 2 == 0) {System.out.println("printEven " + num);num++;lock.notify();lock.wait();}}} catch (InterruptedException e) {e.printStackTrace();}}}
}
http://www.xdnf.cn/news/679645.html

相关文章:

  • UWB:litepoint获取txquality里面的NRMSE
  • CSV数据处理全指南:从基础到实战
  • 第六十八篇 从“超市收银系统崩溃”看JVM性能监控与故障定位实战
  • 递归函数,数学表达式转化成递归函数
  • Spring Boot 深度集成 Ollama 指南:从聊天模型配置到生产级应用开发
  • 【STM32】HAL库 之 CAN 开发指南
  • 常用的数据分布
  • [小白]Docker部署kingbase(人大金仓)数据库[超详细]
  • win11如何重启
  • 算法打卡第八天
  • 工业控制系统的神经网络:TSN交换机是如何改变自动化通信的?
  • Python训练营打卡Day38
  • 【DSP笔记】解锁频率之秘:Z 变换与离散傅里叶变换的深度探索
  • 一些视觉应用中的数学小知识点总结
  • Mate桌面环境系统与终端模拟器参数配置
  • ai客服平台哪家好:AnKo多模型AI聚合时代!
  • Python实现自动物体识别---基于深度学习的AI应用实战
  • 【Git】Commit Hash vs Change-Id
  • 浏览器缓存详细介绍
  • API平台(API网关)的API监控预警机制
  • 欧几里得 ---> 裴蜀定理 ---> 拓展欧几里得
  • 使用MATLAB求解微分方程:从基础到实践
  • ProfiNet转MODBUSTCP网关模块的实时性保障Logix5000控制器与AltivarProcess变频器同步控制方案
  • 【leetcode】977. 有序数组的平方
  • Microbiome|基于MAG的宏转录组
  • TailwindCSS v4 快速入门教程
  • 在Linuxfb环境下利用海思TDE API实现高效的2D图形加速
  • Java中的日期类详解
  • 数据泄露频发,Facebook的隐私保护是否到位?
  • 12. CSS 布局与样式技巧