版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yueloveme/article/details/85040820
大家推荐个靠谱的公众号程序员探索之路,大家一起加油,这个公众号已经接入图灵
package com.zzh; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class TestLoop { /** * 目的 a,b,c三个线程轮询输出A,B,C * 思路: * 用num标记是A,B,C * 方法里判断如果是自己就打印并且把标记更新成下一个 * 如果不是自己就等待 */ public static void main(String[] args) { final Loop loop = new Loop(); new Thread(new Runnable() { @Override public void run() { //打印10轮 for (int i = 1;i <= 10;i++){ loop.loopA(i); } } },"A").start(); new Thread(new Runnable() { @Override public void run() { for (int i = 1;i <= 10;i++){ loop.loopB(i); } } },"B").start(); new Thread(new Runnable() { @Override public void run() { for (int i = 1;i <= 10;i++){ loop.loopC(i); } } },"C").start(); } } class Loop{ private int num = 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 totalLoop){ lock.lock(); try { //如果轮不到自己打印就 if (num != 1){ condition1.await(); } //输出 System.out.println(Thread.currentThread().getName()+"---轮次"+totalLoop); //唤醒b num = 2; condition2.signal(); }catch (Exception e){ }finally { lock.unlock(); } } public void loopB(int totalLoop){ lock.lock(); try { if (num != 2){ condition2.await(); } System.out.println(Thread.currentThread().getName()+"---轮次"+totalLoop); //唤醒c num = 3; condition3.signal(); }catch (Exception e){ }finally { lock.unlock(); } } public void loopC(int totalLoop){ lock.lock(); try { if (num != 3){ condition3.await(); } System.out.println(Thread.currentThread().getName()+"---轮次"+totalLoop); //唤醒A num = 1; condition1.signal(); }catch (Exception e){ }finally { lock.unlock(); } } }