线程间的定制化通信(A线程打印5次,B线程10次,C线程15次)

线程间的定制化通信(A线程打印5次,B线程10次,C线程15次),第1张

线程间的定制化通信(A线程打印5次,B线程10次,C线程15次)

线程间的定制化通信

需求:

分析:

代码的实现:

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;


class Resource {
    //1.定义标示位
    private int flag = 1;//flag=1 AA  flag=2 BB flag=3 CC
    private Lock lock = new ReentrantLock();

    private Condition condition1 = lock.newCondition();
    private Condition condition2 = lock.newCondition();
    private Condition condition3 = lock.newCondition();


    //打印5次,参数第几轮
    public void print5(int loop) throws InterruptedException {
        lock.lock();
        try {
            while (flag != 1) {
                condition1.await();
            }
            //干活
            for (int i = 1; i <= 5; i++) {
                System.out.println(Thread.currentThread().getName() + "::次数:" + i + "轮数:" + loop);
            }
            //修改标志位为2
            flag = 2;
            condition2.signal();

        } finally {
            lock.unlock();

        }


    }

    //打印10次,参数第几轮
    public void print10(int loop) throws InterruptedException {
        lock.lock();
        try {
            while (flag != 2) {
                condition2.await();
            }
            //干活
            for (int i = 1; i <= 10; i++) {
                System.out.println(Thread.currentThread().getName() + "::次数:" + i + "轮数:" + loop);
            }
            //修改标志位为3
            flag = 3;
            condition3.signal();

        } finally {
            lock.unlock();

        }


    }

    //打印10次,参数第几轮
    public void print15(int loop) throws InterruptedException {
        lock.lock();
        try {
            while (flag != 3) {
                condition3.await();
            }
            //干活
            for (int i = 1; i <= 15; i++) {
                System.out.println(Thread.currentThread().getName() + "::次数:" + i + "轮数:" + loop);
            }
            //修改标志位为2
            flag = 1;
            condition1.signal();

        } finally {
            lock.unlock();

        }


    }
}

public class ThreadDemo {
    public static void main(String[] args) {
        Resource resource = new Resource();
        new Thread(() -> {
            for (int i = 1; i <= 10; i++) {
                try {
                    resource.print5(i);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

        }, "AA").start();


        new Thread(() -> {
            for (int i = 1; i <= 10; i++) {
                try {
                    resource.print10(i);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

        }, "BB").start();


        new Thread(() -> {
            for (int i = 1; i <= 15; i++) {
                try {
                    resource.print15(i);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

        }, "CC").start();
    }
}

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5691456.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存