• 【并发编程领域】3个线程依序打印ABC


     大体思路:借助juc中Lock+Condition实现,通过一个变量来标志执行哪一个线程 condition中唤醒对应的线程。ABC线程形成一个环形 A-》B-》C-》A 如此反复就可以

    /**
     * @author i
     * @create 2019/12/29 16:03
     * @Description  ABC线程每次依序打印 ABCABC循环 10次
     */
    class MyShareData{
    
        private Integer count = 0;
        private Lock lock = new ReentrantLock();
        private Condition cA = lock.newCondition();
        private Condition cB = lock.newCondition();
        private Condition cC = lock.newCondition();
    
        public void printA(){
            try {
                //1.判断
                lock.lock();
                while (count != 0){
                    cA.await();//等待
                }
                //2.工作
                System.out.println(Thread.currentThread().getName()+"	 A");
                //3.唤醒其他线程
                count = 1;
                cB.signal();
            }catch (Exception e){
                e.printStackTrace();
            }finally {
                lock.unlock();
            }
        }
    
        public void printB(){
            try {
                //1.判断
                lock.lock();
                while (count != 1){
                    cB.await();//等待
                }
                //2.工作
                System.out.println(Thread.currentThread().getName()+"	 B");
                //3.唤醒其他线程
                count = 2;
                cC.signal();
            }catch (Exception e){
                e.printStackTrace();
            }finally {
                lock.unlock();
            }
        }
    
        public void printC(){
            try {
                //1.判断
                lock.lock();
                while (count != 2){
                    cC.await();//等待
                }
                //2.工作
                System.out.println(Thread.currentThread().getName()+"	 C");
                //3.唤醒其他线程
                count = 0;
                cA.signal();
            }catch (Exception e){
                e.printStackTrace();
            }finally {
                lock.unlock();
            }
        }
    }
    
    public class SynAndReentrantLockDemo {
    
        public static void main(String[] args) {
            MyShareData myShareData = new MyShareData();
            new Thread(()->{
                for (int i = 0; i < 10; i++) {
                    myShareData.printA();
                }
            },"t1").start();
    
            new Thread(()->{
                for (int i = 0; i < 10; i++) {
                    myShareData.printB();
                }
            },"t2").start();
    
            new Thread(()->{
                for (int i = 0; i < 10; i++) {
                    myShareData.printC();
                }
            },"t3").start();
        }
    
    }
  • 相关阅读:
    学习进度笔记01
    《一级架构师实践指南》阅读笔记
    需求概述开发进度14
    需求概述开发进度13
    需求概述开发进度12
    需求概述开发进度11
    需求概述开发进度10
    爬虫的requests库和BeautifulSoup4的学习
    模拟体育竞技分析
    python文件格式转换
  • 原文地址:https://www.cnblogs.com/qxlxi/p/12860740.html
Copyright © 2020-2023  润新知