zoukankan      html  css  js  c++  java
  • 9、JUC--线程按序交替

    线程按序交替

    编写一个程序,开启 3 个线程,这三个线程的 ID 分别为
    A、B、C,每个线程将自己的 ID 在屏幕上打印 10 遍,要
    求输出的结果必须按顺序显示。
    如:ABCABCABC…… 依次递归

    class AlternateDemo{
        private int number =1;//当前执行线程的标记
        
        private Lock lock = new ReentrantLock();
        private Condition condition1 = lock.newCondition();
        private Condition condition2 = lock.newCondition();
        private Condition condition3 = lock.newCondition();
        
        public void loopA(int totalLoop){
            lock.lock();
            try {
                //1、判断
                if(number !=1){
                        condition1.await();
                }
                //2、打印输出
                for(int i=1;i<=5;i++){
                    System.out.println(Thread.currentThread().getName()+"	"+ i + "	" + totalLoop);
                }
                //3、唤醒下一个线程
                number =2;
                condition2.signal();
            }catch (Exception e) {
                e.printStackTrace();
            } finally {
                lock.unlock();
            }
        }
        public void loopB(int totalLoop){
            lock.lock();
            try {
                //1、判断
                if(number !=2){
                        condition2.await();
                }
                //2、打印输出
                for(int i=1;i<=5;i++){
                    System.out.println(Thread.currentThread().getName()+"	"+ i + "	" + totalLoop);
                }
                //3、唤醒下一个线程
                number =3;
                condition3.signal();  
            }catch (Exception e) {
                e.printStackTrace();
            } finally {
                lock.unlock();
            }
        }
        public void loopC(int totalLoop){
            lock.lock();
            try {
                //1、判断
                if(number !=3){
                        condition3.await();
                }
                //2、打印输出
                for(int i=1;i<=5;i++){
                    System.out.println(Thread.currentThread().getName()+"	"+ i + "	" + totalLoop);
                }
                
                //3、唤醒下一个线程
                number =1;
                condition1.signal();
            }catch (Exception e) {
                e.printStackTrace();
            } finally {
                lock.unlock();
            }
        }
    }

    测试类中:

    public static void main(String[] args) {
            AlternateDemo ad = new AlternateDemo();
            //A
            new Thread(new Runnable() {
                
                @Override
                public void run() {
                    for(int i =1;i <10;i++){
                        ad.loopA(i);
                    }
                }
            },"A").start();
            //B
            new Thread(new Runnable() {
                
                @Override
                public void run() {
                    for(int i =1;i <10;i++){
                        ad.loopB(i);
                    }
                    
                }
            },"B").start();
            //C
            new Thread(new Runnable() {
                
                @Override
                public void run() {
                    for(int i =1;i <10;i++){
                        ad.loopC(i);
                    }
                }
            },"C").start();
        }

    测试结果:

  • 相关阅读:
    Mongoose使用
    Koa原理和封装
    微信用户授权
    Koa微信公众号开发
    Koa2+mongoose
    NodeJS-API
    jquery下json数组的操作用法实例
    SqlCacheDependency:asp.net SQL缓存依赖
    SqlCacheDependency轮询数据库表的更改情况的频率
    设置浏览器地址栏URL前面显示的图标
  • 原文地址:https://www.cnblogs.com/Mrchengs/p/10802038.html
Copyright © 2011-2022 走看看