zoukankan      html  css  js  c++  java
  • CyclicBarrier和CountDownLatch区别

    CountDownLatch

    CyclicBarrier
    减计数方式 加计数方式
    计算为0时释放所有等待的线程 计数达到指定值时释放所有等待线程
    计数为0时,无法重置 计数达到指定值时,计数置为0重新开始
    调用countDown()方法计数减一,调用await()方法只进行阻塞,对计数没任何影响 调用await()方法计数加1,若加1后的值不等于构造方法的值,则线程阻塞
    不可重复利用
    可重复利用

    一、CountDownLatch用法

    CountDownLatch类只提供了一个构造器:

    public CountDownLatch(int count) {  };  //参数count为计数值

    然后下面这3个方法是CountDownLatch类中最重要的方法:

    public void await() throws InterruptedException { };   //调用await()方法的线程会被挂起,它会等待直到count值为0才继续执行
    public boolean await(long timeout, TimeUnit unit) throws InterruptedException { };  //和await()类似,只不过等待一定的时间后count值还没变为0的话就会继续执行
    public void countDown() { };  //将count值减1

    CountDownLatch, 一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。

    下面举个例子说明:

    package main.java.CountDownLatch;
     
    import java.util.concurrent.CountDownLatch;
     
    /**
     * PROJECT_NAME:downLoad
     * Author:lucaifang
     * Date:2016/3/18
     */
    public class countDownlatchTest {
        public static void main(String[] args) throws InterruptedException {
            CountDownLatch countDownLatch = new CountDownLatch(5);
            for(int i=0;i<5;i++){
                new Thread(new readNum(i,countDownLatch)).start();
            }
            countDownLatch.await();
            System.out.println("线程执行结束。。。。");
        }
     
        static class readNum  implements Runnable{
            private int id;
            private CountDownLatch latch;
            public readNum(int id,CountDownLatch latch){
                this.id = id;
                this.latch = latch;
            }
            @Override
            public void run() {
                synchronized (this){
                    System.out.println("id:"+id);
                    latch.countDown();
                    System.out.println("线程组任务"+id+"结束,其他任务继续");
                }
            }
        }
    }

    线程在countDown()之后,会继续执行自己的任务,而CyclicBarrier会在所有线程任务结束之后,才会进行后续任务,具体可以看下面例子。

    二、CyclicBarrier用法

    CyclicBarrier提供2个构造器:

    public CyclicBarrier(int parties, Runnable barrierAction) {
    }
     
    public CyclicBarrier(int parties) {
    }

    参数parties指让多少个线程或者任务等待至barrier状态;参数barrierAction为当这些线程都达到barrier状态时会执行的内容。

    CyclicBarrier中最重要的方法就是await方法

    public int await() throws InterruptedException, BrokenBarrierException { };//挂起当前线程,直至所有线程都到达barrier状态再同时执行后续任务;
    public int await(long timeout, TimeUnit unit)throws InterruptedException,BrokenBarrierException,TimeoutException { };//让这些线程等待至一定的时间,如果还有线程没有到达barrier状态就直接让到达barrier的线程执行后续任务

    举例说明

    package main.java.countOff;
     
    import java.util.concurrent.CyclicBarrier;
     
    /**
     * PROJECT_NAME:downLoad
     * Author:lucaifang
     * Date:2016/3/18
     */
    public class cyclicBarrierTest {
        public static void main(String[] args) throws InterruptedException {
            CyclicBarrier cyclicBarrier = new CyclicBarrier(5, new Runnable() {
                @Override
                public void run() {
                    System.out.println("线程组执行结束");
                }
            });
            for (int i = 0; i < 5; i++) {
                new Thread(new readNum(i,cyclicBarrier)).start();
            }
            //CyclicBarrier 可以重复利用,
            // 这个是CountDownLatch做不到的
    //        for (int i = 11; i < 16; i++) {
    //            new Thread(new readNum(i,cyclicBarrier)).start();
    //        }
        }
        static class readNum  implements Runnable{
            private int id;
            private CyclicBarrier cyc;
            public readNum(int id,CyclicBarrier cyc){
                this.id = id;
                this.cyc = cyc;
            }
            @Override
            public void run() {
                synchronized (this){
                    System.out.println("id:"+id);
                    try {
                        cyc.await();
                        System.out.println("线程组任务" + id + "结束,其他任务继续");
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
  • 相关阅读:
    实验楼第二期比赛第二题
    基础练习题
    基本数据类型:数字、字符串、列表、元祖、字典、集合
    二进制与十进制转换
    Python基础--1.2 变量循环基础介绍
    Python基础--1.1Python基础介绍
    旋转木马特效代码
    javascript中全屏滑动效果实现
    正则基础知识总结
    getElementsByClassName 方法兼容性封装方法二
  • 原文地址:https://www.cnblogs.com/u013533289/p/11647831.html
Copyright © 2011-2022 走看看