CyclicBarrier 类似于我们前面看到的CountDownLatch.但是有以下两点不同:
1:CountDownLatch 是当状态达到后即当计数器为零,所有线程通过后CountDownLatch不可再用。而CyclicBarrier 可以当状态达到后,所有线程通过后即可重复使用。
2:CountDownLatch 等待的是事件。CyclicBarrier 等待的是线程.
这里解释下等待事件和线程的区别.
由于CountDownLatch 存在countDown()方法。即对计数器减去1
假设我们有如下代码:CountDownLatch latch = new CountDownLatch(5);
我们在一个线程中对countDown()调用了5次。那么这个CountDownLatch的计数器就减为零。
然后等待的线程就可以通过了。
CyclicBarrier 一直等待指定数量的线程是否全部已经到达await()点了。如果全部达到,则“开闸”释放所有线程继续执行。
我们来看下CyclicBarrier 的方法:
await() | 阻塞知道指定线程到达 |
getParties() | 获取初始指定线程数量 |
await(long timeout, TimeUnit unit) | 阻塞指定的时间内等待所有线程到达。如果没有则返回。 |
isBroken | 查询是否处于损坏状态 |
reset | 重置为初始状态 |
getNumberWaiting() | 获取等待线程数量 |
再看下它的构造器:
CyclicBarrier(int parties) | 指定初始化关卡数量 |
CyclicBarrier(int parties, Runnable barrierAction) | 此处指定了一个Runnable对象。由最后一个进入barrier的线程来执行这个操作. |
举例说明下CyclicBarrier的几种用法:
1.重复使用
package com.asiainfo.concurrent;
/**
* @author fansh
*/
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
public class CyclicBarrierTest {
public static void main(String[] args) {
CyclicBarrier barrier = new CyclicBarrier(5);
System.out.println(barrier.getParties());
for(int i=0;i<5;i++){
BarrierThread thread = new BarrierThread(barrier);
thread.start();
}
}
}
class BarrierThread extends Thread{
private CyclicBarrier barrier;
public BarrierThread(CyclicBarrier barrier){
this.barrier=barrier;
}
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"first point running! ...........");
try {
barrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"first point finished!.............");
try {
Thread.sleep(1000);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"second point running! ...........");
try {
barrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"second point finished!.............");
}
}
分享到:
相关推荐
在实际应用中,我们可以使用CyclicBarrier来控制多个线程之间的协作,例如,在游戏中,我们可以使用CyclicBarrier来控制四个玩家之间的协作,每个玩家需要到达某个关卡时,其他玩家也需要到达该关卡时,所有玩家才能...
6. **多线程**:Java提供了丰富的多线程支持,包括Thread类、Runnable接口、并发工具类如Semaphore、CyclicBarrier等,理解并发与同步的概念及其在实际开发中的应用。 7. **IO流**:Java IO系统包括字节流、字符流...
Java面试是每位Java开发者职业生涯中的重要关卡,它不仅检验了开发者的基础理论知识,还考察了实际编程能力、解决问题的能力以及对技术趋势的理解。这份"Java面试资料大全"包含了丰富的资源,旨在帮助Java程序员准备...
这本书深入浅出地涵盖了Java编程领域的诸多关键知识点,旨在帮助求职者在面试过程中表现出色,顺利通过技术关卡。以下将详细介绍书中可能涉及的一些重要知识点: 1. **Java基础**:包括Java语法、数据类型、控制...
在Java编程的世界里,面试是每一位开发者通往职业发展的重要关卡。这份名为"dictionary-of-java-job-keepers.rar_Keepers"的压缩包,就如同一个守护者,它包含了Java程序员面试时经常会被问到的问题及其详尽的解答,...
Java面试是每位Java开发者职业生涯中的重要关卡,无论是应届毕业生还是有经验的程序员,都需要对Java语言的核心概念、框架、设计模式以及最佳实践有深入理解。以下是一些可能出现在Java面试中的关键知识点: 1. **...
Java面试是每位Java开发者职业生涯中的重要关卡,它考察了候选人的基础知识、编程能力、问题解决技巧以及对特定框架和数据库的理解。这份“java面试题总结资料”包含了多个关键领域的精华,旨在帮助面试者在面试中...
Java面试是每位Java开发者职业生涯中的重要关卡,它考察了开发者对语言特性的理解、实践经验以及问题解决能力。这份"Java面试题经典77问!.zip"压缩包包含了一份PDF文档,它提供了全面的Java面试准备指南。下面,...
4. **并发工具类**:如CountDownLatch、CyclicBarrier等,讨论它们在实际项目中的应用案例。 5. **原子操作**:了解AtomicInteger等原子类的内部实现机制,以及与synchronized关键字的区别。 ### 高级主题 1. **...
《一线名企面试题》是针对Java程序员面试精心编纂的资料合集,尤其适合不同经验层次的初、中、...通过这份《一线名企面试题》压缩包,你可以系统性地复习和提升自己的Java技术水平,为成功闯过面试关卡做好充分准备。
Java面试是每位Java开发者职业生涯中的重要关卡,无论是初出茅庐的新手还是经验丰富的老手,都需要对这个领域有深入的理解。以下是一份详尽的Java面试知识点总结,涵盖了多方面的重要难点。 1. **Java基础知识** -...
- **CyclicBarrier** 是一种多线程同步辅助工具,允许多个线程到达一个关卡后继续执行,可以重复使用,即“循环”屏障。 了解并熟练掌握以上知识点对于编写高效、线程安全的Java应用程序至关重要。在实际开发中,...
同步器,如`Semaphore`(信号量)、`CyclicBarrier`(屏障/关卡)和`CountDownLatch`(计数门),是Java并发编程中的重要工具。`Semaphore`可以限制同时访问特定资源的线程数量,`CyclicBarrier`则要求所有线程都到达一个...
4. **并发编程**:线程同步机制(synchronized、Lock),并发容器(ConcurrentHashMap、CountDownLatch、CyclicBarrier等),以及并发设计原则。 5. **算法与数据结构**:排序(快速排序、归并排序、堆排序等)、...
在IT行业中,面试是每个求职者必经的关卡,特别是对于Java开发者来说,扎实的理论基础、实践经验以及良好的问题解决能力是成功的关键。本文将根据"InterviewNote:准备面试"这一主题,深入探讨Java相关的面试知识点,...