CountDownLatch 一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待
CyclicBarrier 一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。
这是JAVA1.5中的2个帮助类,他们2都是直接继承java.lang.Object的,目的是为了让线程之间的相互等待变得简单。
CountDownLatch的用法如下(CyclicBarrier要更加简单一些而且更加强大一些,用法参看
http://www.iteye.com/topic/1116068之前写的一个测试)
package thread.concurrent.CountDownLatch;
import java.util.AbstractQueue;
import java.util.Random;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.CountDownLatch;
/**
* CountDownLatch:一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。
* 用给定的计数 初始化 CountDownLatch。由于调用了 countDown() 方法,所以在当前计数到达零之前,
* await 方法会一直受阻塞。之后,会释放所有等待的线程,await 的所有后续调用都将立即返回。
* 这种现象只出现一次——计数无法被重置。如果需要重置计数,请考虑使用 CyclicBarrier。
*/
public class CountDownLatchTest {
public static void main(String[] args) throws InterruptedException {
int threadCount = 10;
CountDownLatch beginSingle = new CountDownLatch(1);
CountDownLatch endSingle = new CountDownLatch(threadCount);
AbstractQueue<SportsMan> queue = new ArrayBlockingQueue<SportsMan>(
threadCount);
for (int i = 0; i < threadCount; i++) {
new Thread(new WorkThread(queue, beginSingle, endSingle)).start();
}
beginSingle.countDown();//②枪响
endSingle.await();//③使当前线程等待,直到endSingle计数器递减到0才放开
System.out.println("统计成绩:" + queue);
}
}
//每个线程代表一个运动员
class WorkThread implements Runnable {
AbstractQueue<SportsMan> queue;
CountDownLatch countDownLatch;
CountDownLatch endSingle;
public WorkThread(AbstractQueue<SportsMan> queue,
CountDownLatch countDownLatch, CountDownLatch endSingle) {
super();
this.queue = queue;
this.countDownLatch = countDownLatch;
this.endSingle = endSingle;
}
public void run() {
try {
countDownLatch.await();//①运动员各就各位
int time = (new Random()).nextInt(10);
System.out.println("线程:" + Thread.currentThread().getName() + "用时:"
+ time);
queue.add(new SportsMan(Thread.currentThread().getName(), time));
endSingle.countDown();//③每次有人跑到终点,则结束计数器递减,当结束计数器递减到0也就是所有人都跑完了就进行成绩统计。
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
// 运动员类
class SportsMan {
String name;
Integer time;
public SportsMan(String name, Integer time) {
super();
this.name = name;
this.time = time;
}
public String toString() {
return "{name:" + name + ",time:" + time + "}";
}
}
分享到:
相关推荐
《java并发编程》中CountDownLatch和CyclicBarrier用法实例大全,几乎包含了所有重要的用法
mybaits 多线程 实现数据批量插入 (运用CountDownLatch实现闭锁) 1、mybatis批处理 2、数据分批量查询 3、数据分批量插入
CountDownLatch 和 CyclicBarrier 为线程同步的辅助工具,通过它可以做到使一条线程一直阻塞等待,直到其他线程完成其所处理的任务。
主要介绍了如何使用CountDownLatch同步java多线程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
java并发编程中CountDownLatch和CyclicBarrier的使用借鉴.pdf
利用 CountDownLatch 类实现线程同步,而不用回调机制。详见我的博文 http://blog.csdn.net/kroclin/article/details/37956949
java并发编程中CountDownLatch和CyclicBarrier的使用.pdf
NULL 博文链接:https://cpjsjxy.iteye.com/blog/2272451
CountDownLatch可以实现一个线程等待多个线程、多个线程等待一个线程、多个线程等待多个线程(这里不涉及)。 我们首先来看看怎么实现一个线程等待多个线程吧。 工厂中,对产品需要进行质检,5个工人进行检查,所有...
java 高并发应用场景
主要为大家详细介绍了使用CountDownLatch等待多线程全部执行完成,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
它的作用类似于CountDownLatch,可以让一个或多个线程等待其他线程执行完毕后再继续执行。 CyclicBarrier可以被看作是一个屏障,当所有线程都到达这个屏障时,所有线程才能继续执行。与CountDownLatch不同的是,...
主要介绍了详解java CountDownLatch和CyclicBarrier在内部实现和场景上的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
在JDK的并发包里提供了几个非常有用的并发容器和并发工具类,供我们在多线程开发中进行使用。 并发包的来历: 在实际开发中如果不需要考虑线程安全问题,大家不需要做线程安全,因为如果做了反而性能不好! 但是开发...
主要介绍了Java中CountDownLatch进行多线程同步详解及实例代码的相关资料,需要的朋友可以参考下
JUC(Java Util Concurrent)是Java中用于并发编程的工具包,提供了一组接口和类,用于...并发工具类:JUC提供了一些并发编程的工具类,如Semaphore、CountDownLatch、CyclicBarrier等,可以实现线程间的协作和同步。
主要介绍了Java并发编程:CountDownLatch与CyclicBarrier和Semaphore的实例详解的相关资料,需要的朋友可以参考下
看完《think in java》多线程章节,自己写的多线程文档,还结合了其他的相关网络资料。 线程 一. 线程池 1)为什么要使用线程池 2 2)一个具有线程池的工作队列 3 3)使用线程池的风险: 4 4)有效使用线程池的原则 5...
【2018最新最详细】并发多线程教程,课程结构如下 1.并发编程的优缺点 2.线程的状态转换以及基本操作 3.java内存模型以及happens-before规则 4.彻底理解synchronized 5.彻底理解volatile 6.你以为你真的了解final吗...