大号在练葵花宝典 发表于 2023-11-26 03:58:56

Lock实现线程间定制化通信

Lock实现线程间定制化通信

案例

要求

三个线程,AA BB CC AA线程打印5次,BB线程打印10次,CC线程打印15次
代码实现

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
页: [1]
查看完整版本: Lock实现线程间定制化通信