博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CyclicBarrier和CountDownLatch区别
阅读量:5009 次
发布时间:2019-06-12

本文共 3891 字,大约阅读时间需要 12 分钟。

CyclicBarrier和CountDownLatch 都位于java.util.concurrent 这个包下

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+"结束,其他任务继续");            }        }    }}

输出结果:

id:1

线程组任务1结束,其他任务继续
id:0
线程组任务0结束,其他任务继续
id:2
线程组任务2结束,其他任务继续
id:3
线程组任务3结束,其他任务继续
id:4
线程组任务4结束,其他任务继续
线程执行结束。。。。

线程在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();                }            }        }    }}

输出结果:

id:1

id:2
id:4
id:0
id:3
线程组执行结束
线程组任务3结束,其他任务继续
线程组任务1结束,其他任务继续
线程组任务4结束,其他任务继续
线程组任务0结束,其他任务继续
线程组任务2结束,其他任务继续

 

转载于:https://www.cnblogs.com/AnXinliang/p/9872947.html

你可能感兴趣的文章
22-reverseString-Leetcode
查看>>
Centos 开机自动联网
查看>>
cocos2dx使用lua和protobuf
查看>>
使用Spring配合Junit进行单元测试的总结
查看>>
HDOJ 5630 Rikka with Chess
查看>>
netcore2.1 在后台运行一个任务
查看>>
PostgreSQL pg_hba.conf 文件简析
查看>>
android o logcat read: unexpected EOF!
查看>>
[Scrum]2010/12/28 —— 第一天!
查看>>
ASP.NET MVC模式 温习(一)排除MVC模式误区
查看>>
Mysql的read_only 只读属性说明 (运维笔记)
查看>>
DOCKER 从入门到放弃(五)
查看>>
Python 多线程学习
查看>>
appcan官方ajax
查看>>
获取NVIDIA显卡的温度
查看>>
Dijkstra算法
查看>>
Deep Learning 9: Performance
查看>>
面试题61 把二叉树打印成多行
查看>>
C#例子 易懂故事 接口 委托 事件 异步通知 好玩.
查看>>
[转]Windows Shell 编程 第十一章 【来源:http://blog.csdn.net/wangqiulin123456/article/details/7987992】...
查看>>