zoukankan      html  css  js  c++  java
  • 多线程之按序打印

     好久没写博客了 。。。。

            这道题是典型的设置执行屏障的问题,要确保 two() 方法在 one() 方法之后被执行,three() 方法在 two() 方法之后被执行,对于这道问题的解法我可以直接定义一个变量variable,三个线程分别去监控variable值,当variable=0的时候执行第一个方法,variable=1的时候执行第二个方法,variable=2的时候执行第三个方法。

           当variable的值被修改时,其他线程应该要马上能知道variable值的变化,才能做出判断执不执行本身方法,所以variable变量要用volatile关键字修饰来保证线程之间的可见性,比如variable初始值为0,线程A执行方法一,执行完方法一之后把variable的值加1此时variable的值变成了1,由于variable变量用了volatile来修饰,所以线程B马上就能知道variable的值变为了1,所以此时线程B就会调用方法二...

     1 class Foo {
     2 
     3      public Foo() {
     4         
     5     }
     6     private volatile int variable=0;
     7     public void first(Runnable printFirst) throws InterruptedException {
     8         printFirst.run();
     9         variable++;
    10     }
    11 
    12     public void second(Runnable printSecond) throws InterruptedException {
    13         while (true){
    14             if(variable==1) break;
    15         }
    16         printSecond.run();
    17         variable++;
    18     }
    19 
    20     public void third(Runnable printThird) throws InterruptedException {
    21          while (true){
    22             if(variable==2) break;
    23         }
    24         printThird.run();
    25     }
    26 }

    Leecode上提交结果:

    多线程之按序打印
     

    CountDownLatch能够使一个线程等待其他线程完成各自的工作后再执行,这样子我们可以让线程B等待线程A执行完成之后再执行,线程C等待线程B执行完成之后再执行就可以实现按序打印了。

    CountDownLatch通过构造函数构造一个计数器来实现,计数器的数值即为为线程的数量,每当一个线程完成了自己的任务后,计数器的值就会减1,计数器值为0时,表示CountDownLatch里面所有的线程已经完成了任务,然后在闭锁上等待的线程就可以恢复执行任务。具体实现看代码注释。

    classFoo{
    
    publicFoo(){
    
    }
    privateCountDownLatcha=newCountDownLatch(1);//信号量a
    privateCountDownLatchb=newCountDownLatch(1);//信号量b
    
    publicvoidfirst(RunnableprintFirst)throwsInterruptedException{
    printFirst.run();
    a.countDown();//信号量a计数器减1,计数器变为0,表示信号量a执行完。
    }
    
    publicvoidsecond(RunnableprintSecond)throwsInterruptedException{
    a.await();//等待信息量a的线程执行完
    printSecond.run();
    b.countDown();//信号量b减一,计数器变为0,表示信号量b执行完。
    }
    
    publicvoidthird(RunnableprintThird)throwsInterruptedException{
    b.await();//等待信号量b的线程执行完
    printThird.run();
    }
    }

    LeeCode运行结果:

    多线程之按序打印




  • 相关阅读:
    StackStorm简介及其部署
    Nginx系列(十二)——性能调整
    Nginx系列(十一)——通过日志进行故障排查
    Nginx系列(十)——可用性监控进阶
    Nginx系列(九)——容器/微服务
    Nginx系列(八)——数字媒体流
    Nginx系列(七)——HTTP/2
    Nginx系列(六)——安全控制
    Nginx系列(五)——认证
    Nginx系列(四)——配置文件自动化管理
  • 原文地址:https://www.cnblogs.com/zjm-1/p/12051378.html
Copyright © 2011-2022 走看看