Lock实现线程间定制化通信
案例
要求
三个线程,AA BB CC AA线程打印5次,BB线程打印10次,CC线程打印15次
代码实现
[code]import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;/** * @author 长名06 * @version 1.0 * 线程定制化通信 *///第一步,创建共享资源,和操作方法class ShareFlag { private Lock lock = new ReentrantLock(); private int flag = 1; private Condition c1 = lock.newCondition();//一个Condition对象,只能唤醒由该对象阻塞的线程 private Condition c2 = lock.newCondition(); private Condition c3 = lock.newCondition(); public void print5(int loop) throws InterruptedException { lock.lock(); try { //第四步,避免虚假唤醒现象 while (flag != 1) {//第2.1步 判断是否满足线程工作条件,阻塞 c1.await(); } //第2.2步 具体执行 for (int i = 0; i < 5; i++) { System.out.println(Thread.currentThread().getName() + "\t" + i +"次输出" + "flag=" + flag + "轮数" + loop); } flag = 2; //通知(唤醒等待线程) c2.signal(); } finally { lock.unlock(); } } public void print10(int loop) throws InterruptedException { lock.lock(); try { while (flag != 2) { c2.await(); } for (int i = 0; i < 10; i++) { System.out.println(Thread.currentThread().getName() + "\t" + i +"次输出" + "flag=" + flag + "轮数" + loop); } flag = 3; //通知(唤醒等待线程) c3.signal(); } finally { lock.unlock(); } } public void print15(int loop) throws InterruptedException { lock.lock(); try { while (flag != 3) { c3.await(); } for (int i = 0; i < 15; i++) { System.out.println(Thread.currentThread().getName() + "\t" + i +"次输出" + "flag=" + flag + "轮数" + loop); } flag = 1; //通知(唤醒等待线程) c1.signal(); } finally { lock.unlock(); } }}public class ThreadDemoByCust { public static void main(String[] args) { ShareFlag shareFlag = new ShareFlag(); new Thread(() -> { for (int i = 1; i { for (int i = 1; i { for (int i = 1; i |