案例 java并发编程应用实例
学习视频资料地址:
网盘资料地址:
链接:https://pan.baidu.com/s/1w8jHhXaQZS9YK_79FMTy4w 提取码:ckeb
代码示例十:
package com.juchaosoft.test; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** * 线程按序交替 * @author wang-xiaoming * */ public class TestAlternateABC10_01 { public static void main(String[] args) { AlternateDemo ad = new AlternateDemo(); // 三个线程同时开启,循环十次并按照线程规定顺序打印ABC new Thread(new Runnable() { @Override public void run() { for (int i = 0; i < 10; i++) { ad.loopA(i, 1); } } }, "A").start(); new Thread(new Runnable() { @Override public void run() { for (int i = 0; i < 10; i++) { ad.loopB(i, 2); } } }, "B").start(); new Thread(new Runnable() { @Override public void run() { for (int i = 0; i < 10; i++) { ad.loopC(i, 3); System.out.println("第" + (i + 1) + "次执行结束。。"); } } }, "C").start(); } } class AlternateDemo{ // 当前正在执行的线程的标记 private int number = 1; private Lock lock = new ReentrantLock(); private Condition condition1 = lock.newCondition(); private Condition condition2 = lock.newCondition(); private Condition condition3 = lock.newCondition(); public void loopA(int total, int times){ lock.lock(); try { // 1、判断线程 while(number != 1){ condition1.await(); } // 2、打印 for (int i = 0; i < times; i++) { System.out.println(Thread.currentThread().getName() + "\t" + i + "\t" + total); } // 3、结束,唤醒下一个线程 number = 2; condition2.signal(); } catch (Exception e) { Thread.currentThread().interrupt(); } finally { lock.unlock(); } } public void loopB(int total, int times){ lock.lock(); try { // 1、判断线程 while(number != 2){ condition2.await(); } // 2、打印 for (int i = 0; i < times; i++) { System.out.println(Thread.currentThread().getName() + "\t" + i + "\t" + total); } // 3、结束,唤醒下一个线程 number = 3; condition3.signal(); } catch (Exception e) { Thread.currentThread().interrupt(); } finally { lock.unlock(); } } public void loopC(int total, int times){ lock.lock(); try { // 1、判断线程 while(number != 3){ condition3.await(); } // 2、打印 for (int i = 0; i < times; i++) { System.out.println(Thread.currentThread().getName() + "\t" + i + "\t" + total); } // 3、结束,唤醒下一个线程 number = 1; condition1.signal(); } catch (Exception e) { Thread.currentThread().interrupt(); } finally { lock.unlock(); } } }
console:
A 0 0 B 0 0 B 1 0 C 0 0 C 1 0 C 2 0 第1次执行结束。。 A 0 1 B 0 1 B 1 1 C 0 1 C 1 1 C 2 1 第2次执行结束。。 A 0 2 B 0 2 B 1 2 C 0 2 C 1 2 C 2 2 第3次执行结束。。 A 0 3 B 0 3 B 1 3 C 0 3 C 1 3 C 2 3 第4次执行结束。。 A 0 4 B 0 4 B 1 4 C 0 4 C 1 4 C 2 4 第5次执行结束。。 A 0 5 B 0 5 B 1 5 C 0 5 C 1 5 C 2 5 第6次执行结束。。 A 0 6 B 0 6 B 1 6 C 0 6 C 1 6 C 2 6 第7次执行结束。。 A 0 7 B 0 7 B 1 7 C 0 7 C 1 7 C 2 7 第8次执行结束。。 A 0 8 B 0 8 B 1 8 C 0 8 C 1 8 C 2 8 第9次执行结束。。 A 0 9 B 0 9 B 1 9 C 0 9 C 1 9 C 2 9 第10次执行结束。。
雨淋淋过的季节
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!