Java程序之多线程顺序打印 ABC--Condition(推荐)
package abc3; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; class ABCPrinter {//使用ReentrantLock + condition //这里指的是三个线程总共打印100个 private static final int PRINT_COUNT = 15; private static volatile int count = 0;//静态保证类的所有对象都共享一份 volatile保证可见性,禁止指令重排序 private static final Lock lock = new ReentrantLock(); private static final Condition conditionA = lock.newCondition(); private static final Condition conditionB = lock.newCondition(); private static final Condition conditionC = lock.newCondition(); public static void main(String[] args) { new Thread(() -> println("a", conditionA, conditionB)).start(); new Thread(() -> println("b", conditionB, conditionC)).start(); new Thread(() -> println("c", conditionC, conditionA)).start(); } private static void println(String str, Condition current, Condition next) { try { lock.lock(); while (count < PRINT_COUNT) { while (count % 3 != getThreadIndex(str)) {//套while循环 防止虚假唤醒 current.await(); } if (count < PRINT_COUNT) {//双重判断 防止最后阻塞的线程唤醒后 打印数字超过范围 System.out.println(Thread.currentThread().getName() + " : " + count + " : " + str); } count++; next.signal(); } } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } } private static int getThreadIndex(String str) { switch (str) { case "a": return 0; case "b": return 1; case "c": return 2; default: throw new IllegalArgumentException("Invalid thread name"); } } }
分类:
JAVA-并发编程
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
2015-12-12 教你如何精通Struts:Tiles框架