• 两个线程交替打印1-100


    public class Solution2 {
        private static final Object lock = new Object();  //表示对象锁
    
        private volatile int index = 1;           //表示要输出的数字
    
        private volatile boolean aHasPrint = false;      //记录A是否被打印过
    
        class A implements Runnable {
            @Override
            public void run() {
                for (int i = 0; i < 50; i++) {
                    synchronized (lock) {
                        while (aHasPrint) {              //如果A已经打印过就进行阻塞
                            try {
                                lock.wait();
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                        System.out.println("A:" + index);    //A没有打印过则输出A的值
                        index++;                   //输出的值增加1
                        aHasPrint = true;             //表示A已经打印过
                        lock.notifyAll();            //唤醒其它线程执行
                    }
                }
            }
        }
    
        class B implements Runnable {
            @Override
            public void run() {
                for (int i = 0; i < 50; i++) {
                    synchronized (lock) {
                        while (!aHasPrint) {               //如果A没有打印过则阻塞
                            try {
                                lock.wait();
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                        System.out.println("B:" + index);  //输出B的值
                        index++;                 //计数加一
                        aHasPrint = false;          //B打印完了说明新的一轮开始了,将标识为计为A没有打印过
                        lock.notifyAll();          //唤醒阻塞线程
                    }
                }
            }
        }
    
    
        public static void main(String[] args) {
            Solution2 solution2 = new Solution2();
            Thread threadA = new Thread(solution2.new A());
            Thread threadB = new Thread(solution2.new B());
            threadA.start();
            threadB.start();
        }
    }

     相关代码 https://github.com/LiWangCai/blogRelated 可自行获取

  • 相关阅读:
    索引!
    事件event
    Erlang运行时源码分析之——线程进度机制
    Erlang 运行时中使用的读写锁解析
    经典互斥算法解析
    网格布局之grid
    注册简单表单
    前端入门之自我介绍
    Python之一后置固件yield和终结函数addfinalizer
    python中yield 与 return 区别
  • 原文地址:https://www.cnblogs.com/liwangcai/p/10741644.html
Copyright © 2020-2023  润新知