并发编程ABC循环打印问题实现,JUC

参考文档:https://www.cnblogs.com/linkworld/p/7819270.html
参考视频:
https://www.bilibili.com/video/BV14W411u7gB?from=search&seid=924727718441316160

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

/**
 * @Author:CarlosXu
 * @Date:2019/10/25
 */
// 编写一个程序,开启3个线程,这三个线程的 ID 分别为 A, B, C, 每个线程将自己的 ID 在屏幕上打印10遍,
// 要求输出的结果必须按顺序显示:
// 如: ABCABCABC... 依次递归
public class TestABCAlernate {
    public static void main(String[] args) {
        AlernateDemo demo=new AlernateDemo();
        //创建三个线程ABC
        new Thread(()->{
            for (int i=0;i<5;i++){
                demo.loopA(i);
            }
        },"A").start();

        new Thread(()->{
            for (int i=0;i<5;i++){
                demo.loopB(i);
            }
        },"B").start();

        new Thread(()->{
            for (int i=0;i<5;i++){
                demo.loopC(i);
            }
        },"C").start();
    }
}

class AlernateDemo {
    //标记当前正在执行的线程
    private int num = 1;
	//同步锁
    private Lock lock = new ReentrantLock();
    //lock锁的唤醒机制
    private Condition condition1 = lock.newCondition();
    private Condition condition2 = lock.newCondition();
    private Condition condition3 = lock.newCondition();

	//线程A ,total表示循环几轮
    public void loopA(int total) {
        lock.lock();
        try {
            if (num != 1) {
            //如果不是当前线程,当前线程等待,等待其他线程唤醒
                condition1.await();
            }
            System.out.println(Thread.currentThread().getName() + "===" + num + "===" + total);
            //唤醒线程B
            num = 2;
            condition2.signalAll();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
        }
    }
//线程B ,total表示循环几轮
    public void loopB(int total) {
        lock.lock();
        try {
            if (num != 2) {
             //如果不是当前线程,当前线程等待,等待其他线程唤醒
                condition2.await();
            }
            System.out.println(Thread.currentThread().getName() + "===" + num + "===" + total);
            //唤醒线程C
            num = 3;
            condition3.signalAll();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
        }
    }
//线程C ,total表示循环几轮
    public void loopC(int total) {
        lock.lock();
        try {
            if (num != 3) {
             //如果不是当前线程,当前线程等待,等待其他线程唤醒
                condition3.await();
            }
            System.out.println(Thread.currentThread().getName() + "===" + num + "===" + total);
            //唤醒线程 A
            num = 1;
            condition1.signalAll();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
        }
    }

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章