ToB企服应用市场:ToB评测及商务社交产业平台

标题: Lock实现线程间定制化通信 [打印本页]

作者: 大号在练葵花宝典    时间: 2023-11-26 03:58
标题: Lock实现线程间定制化通信
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




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4