Lock实现线程间定制化通信

打印 上一主题 下一主题

主题 914|帖子 914|积分 2742

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
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

大号在练葵花宝典

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表