如何进行并发工具类CountDownLatch与CyclicBarrier分析

如何进行并发工具类CountDownLatch与CyclicBarrier分析,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

成都创新互联公司自2013年起,先为黄陂等服务建站,黄陂等地企业,进行企业商务咨询服务。为黄陂企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。

CountDownLatch

基本的流程是一个线程等待其他的线程完成工作以后再执行,加强版join

类的主要方法,await用来等待,countDown(在线程里面)用来减一。

      由初始化线程决定是否放行。

我们来用代码演示下CountDownLatch的基本使用:

public class UserCountDownLatch {  static CountDownLatch latch = new CountDownLatch(6);  //初始化线程  private static class InitThread implements Runnable{    @Override    public void run() {      System.out.println("Thread_"+Thread.currentThread().getId()+" ready init work ...");      latch.countDown();//初始化线程完成工作了。扣一次    }  }  public static void main(String[] args) throws InterruptedException {    //单独的初始化线程,初始化分为2步,需扣减两次    new Thread(new Runnable() {      @Override      public void run() {        try {          Thread.sleep(1000);          System.out.println("Thread_"+Thread.currentThread().getId()              +" ready init work step lst.....");          latch.countDown();//每完成一步工作,就扣减一次          System.out.println("begin step 2nd......");          Thread.sleep(1000);          System.out.println("Thread_"+Thread.currentThread().getId()              +" ready init work step 2nd.....");          latch.countDown();//每完成一步工作,就扣减一次        } catch (InterruptedException e) {          // TODO Auto-generated catch block          e.printStackTrace();        }
     }    }).start();    for(int i=0;i<=3;i++){      Thread thread = new Thread(new InitThread());      thread.start();    }    latch.await();    System.out.println("Main do ites work ....");  }}

 结果:

Thread_14 ready init work ...Thread_12 ready init work ...Thread_11 ready init work ...Thread_13 ready init work ...Thread_10 ready init work step lst.....begin step 2nd......Thread_10 ready init work step 2nd.....Main do ites work ....

小结:就必须等到countDown减完才开始执行main方法后面的程序。

CyclicBarrier

让一组线程达到某个屏障,被阻塞,一直到组内最后一个线程达到屏障时,屏障开放,所有被阻塞的线程会继续运行。

      由工作线程决定是否运行。

我们来用代码演示下CyclicBarrier的基本使用:

public class UseCyclicBarrier {  private static CyclicBarrier barrier =       new CyclicBarrier(5,new CollectThread());//屏障开放后,CollectThread()就会执行.    private static ConcurrentHashMap<String, Long> resultMap =       new ConcurrentHashMap<String, Long>();//存放子线程工作结果的容器    public static void main(String[] args){    for(int i=0;i<=4;i++){      Thread thread = new Thread(new SubThread());      thread.start();    }  }  //负责屏障开放以后的工作  private static class CollectThread implements Runnable{    @Override    public void run() {      StringBuilder result = new StringBuilder();      for(Map.Entry<String, Long> workResult:resultMap.entrySet()){        result.append("["+workResult.getValue()+"]");      }            System.out.println("the result = "+result);      System.out.println("do other business......");    }    }  //工作线程  private static class SubThread implements Runnable{    @Override    public void run() {      long id = Thread.currentThread().getId();      resultMap.put(Thread.currentThread().getId()+"", id);      Random r = new Random();//随机决定工作线程的是否睡眠      try{        if(r.nextBoolean()){            Thread.sleep(2000+id);            System.out.println("Thread_"+id+".....do its business ");          }          System.out.println(id+".....is await");          barrier.await();//          Thread.sleep(1000+id);          System.out.println("Thread_"+id+".....do its business ");        }catch(Exception e){          e.printStackTrace();        }      }    }  }

小结:在初始化的时候,开放屏障后,可以使用指定执行的线程。

CyclicBarrier(int parties,RunnablebarrierAction)

不同在于动作的实施者是不同的,CountDownLatch的下一步动作实施者是main函数,而CyclicBarrier下一步的动作实施者可以为其他线程。

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注创新互联行业资讯频道,感谢您对创新互联的支持。

当前名称:如何进行并发工具类CountDownLatch与CyclicBarrier分析
文章来源:https://www.cdcxhl.com/article46/gpeceg.html

成都网站建设公司_创新互联,为您提供商城网站软件开发自适应网站用户体验搜索引擎优化移动网站建设

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

成都定制网站建设