CyclicBarrier类
一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。因为该 barrier 在释放等待线程后可以重用,所以称它为循环的 barrier。
CyclicBarrier支持一个可选的 Runnable 命令,在一组线程中的最后一个线程到达之后(但在释放所有线程之前),该命令只在每个屏障点运行一次。若在继续所有参与线程之前更新共享状态,此屏障操作很有用。
CyclicBarrier(int parties, Runnable barrierAction) 构造方法:
创建一个新的 CyclicBarrier,它将在给定数量的参与者(线程)处于等待状态时启动,并在启动 barrier 时执行给定的屏障操作,该操作由最后一个进入 barrier 的线程执行。
实例1:
package com.bijian.thread;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
public class SubTask extends Thread {
private String name;
private CyclicBarrier cb;
SubTask(String name, CyclicBarrier cb) {
this.name = name;
this.cb = cb;
}
public void run() {
System.out.println("[子任务" + name + "]开始执行了!");
try {
Thread.sleep(1000);
} catch(Exception e) {
}
for (int i = 0; i < 999999; i++)
; // 模拟耗时的任务
System.out.println("[子任务" + name + "]开始执行完成了,并通知障碍器已经完成!");
try {
// 通知障碍器已经完成
cb.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}
}
package com.bijian.thread;
public class MainTask implements Runnable {
public void run() {
System.out.println(">>>>主任务执行了!<<<<");
}
}
package com.bijian.thread;
import java.util.concurrent.CyclicBarrier;
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
CyclicBarrier cb = new CyclicBarrier(7, new MainTask());
new SubTask("A", cb).start();
new SubTask("B", cb).start();
new SubTask("C", cb).start();
new SubTask("D", cb).start();
new SubTask("E", cb).start();
new SubTask("F", cb).start();
}
}
运行结果(程序输出如下信息后一直处于阻塞状态):
[子任务A]开始执行了!
[子任务C]开始执行了!
[子任务B]开始执行了!
[子任务D]开始执行了!
[子任务E]开始执行了!
[子任务F]开始执行了!
[子任务F]开始执行完成了,并通知障碍器已经完成!
[子任务C]开始执行完成了,并通知障碍器已经完成!
[子任务E]开始执行完成了,并通知障碍器已经完成!
[子任务B]开始执行完成了,并通知障碍器已经完成!
[子任务D]开始执行完成了,并通知障碍器已经完成!
[子任务A]开始执行完成了,并通知障碍器已经完成!
实例2(修改Main类如下):
package com.bijian.thread;
import java.util.concurrent.CyclicBarrier;
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
CyclicBarrier cb = new CyclicBarrier(7, new MainTask());
new SubTask("A", cb).start();
new SubTask("B", cb).start();
new SubTask("C", cb).start();
new SubTask("D", cb).start();
new SubTask("E", cb).start();
new SubTask("F", cb).start();
new SubTask("G", cb).start();
new SubTask("GG01", cb).start();
new SubTask("GG02", cb).start();
new SubTask("GG03", cb).start();
new SubTask("GG04", cb).start();
new SubTask("GG05", cb).start();
new SubTask("GG06", cb).start();
}
}
运行结果(在7个或多于7个子任务输出“开始执行完成了,并通知障碍器已经完成!”信息后,才会输出“>>>>主任务执行了!<<<<”,即MainTask线程将在给定数量(在这为7)的参与者(线程)处于等待状态时启动):
[子任务A]开始执行了!
[子任务C]开始执行了!
[子任务B]开始执行了!
[子任务D]开始执行了!
[子任务E]开始执行了!
[子任务F]开始执行了!
[子任务G]开始执行了!
[子任务GG01]开始执行了!
[子任务GG02]开始执行了!
[子任务GG03]开始执行了!
[子任务GG04]开始执行了!
[子任务GG05]开始执行了!
[子任务GG06]开始执行了!
[子任务G]开始执行完成了,并通知障碍器已经完成!
[子任务GG01]开始执行完成了,并通知障碍器已经完成!
[子任务GG06]开始执行完成了,并通知障碍器已经完成!
[子任务GG04]开始执行完成了,并通知障碍器已经完成!
[子任务C]开始执行完成了,并通知障碍器已经完成!
[子任务A]开始执行完成了,并通知障碍器已经完成!
[子任务D]开始执行完成了,并通知障碍器已经完成!
>>>>主任务执行了!<<<<
[子任务F]开始执行完成了,并通知障碍器已经完成!
[子任务GG02]开始执行完成了,并通知障碍器已经完成!
[子任务GG05]开始执行完成了,并通知障碍器已经完成!
[子任务GG03]开始执行完成了,并通知障碍器已经完成!
[子任务B]开始执行完成了,并通知障碍器已经完成!
[子任务E]开始执行完成了,并通知障碍器已经完成!
分享到:
相关推荐
对于并发编程,JDK1.5引入了java.util.concurrent包,其中包括了线程池、Future、Callable接口以及CyclicBarrier和Semaphore等同步工具类,极大地丰富了并发处理能力,提升了多线程环境下的性能和可维护性。...
《Java JDK1.5实例宝典》是一本深入解析JDK1.5版本中关键特性和类库的实践指南,涵盖了Java Mail、Servlet、JSP以及多线程等多个核心领域。这本书通过丰富的实例来帮助读者理解和掌握Java编程的精髓。 在JDK1.5中,...
JDK 1.5引入了`java.util.concurrent`包,提供了许多高级并发工具,如`ExecutorService`、`Future`、`Callable`、`CyclicBarrier`、`Semaphore`等,大大简化了并发编程。 **线程池的概念** 线程池(ThreadPool)是...
这本书详细对比了JDK 1.4和JDK 1.5之间的差异,帮助开发者理解不同版本下线程处理的进化与改进。 在Java编程中,线程是并发执行的程序片段,它使得一个应用程序可以在同一时间执行多个任务。Java提供了丰富的API来...
每个Lock实例可以有多个Condition实例,从而可以实现不同的等待集合。 2. **Phaser** - 在3.1版本中,backport-util-concurrent引入了Phaser,这是一个可重用的同步帮助器类,支持多个参与者之间的有界同步,类似...
Java JDK实例开发宝典源代码是一份非常宝贵的资源,它涵盖了Java开发中的各种核心概念和技术。JDK(Java Development Kit)是Java编程的基础,包含了Java运行环境、编译器、调试器以及各种工具,是每个Java开发者...
2. **枚举(Enums)**:JDK1.5引入,1.6继续完善,枚举类型为常量集合提供了一种强大的、类型安全的表示方式。枚举类型不能被实例化,有助于防止错误和提高代码质量。 3. **并发(Concurrency)**:1.6版本对并发库...
2. **类型推断(Type Inference)**:引入了钻石操作符(),简化了泛型实例化,例如`List<String> list = new ArrayList();`,减少了代码冗余。 3. **try-with-resources**:这是一种新的异常处理结构,允许在try...
1. **多线程并发控制**:引入了Fork/Join框架,通过工作窃取算法提高并行计算效率,同时提供了`Phaser`、`CountDownLatch` 和 `CyclicBarrier` 等并发工具类。 2. **Strings in Switch**:在switch语句中可以直接...
《Professional Java JDK 6 Edition》这本书不仅涵盖了这些技术细节,还包含了丰富的实例和最佳实践,旨在帮助读者掌握JDK 6的精髓,从而提升他们的Java编程能力。通过阅读这本书,你可以深入了解JDK 6的内部工作...
3. **使用ExecutorService和Callable接口**:JDK 1.5引入的Executor框架允许更高级别的线程管理。Callable接口与Runnable类似,但可以返回结果。使用ExecutorService可以创建线程池,有效管理线程生命周期,提高性能...
3. **增强的枚举类型**:JDK 1.6增强了枚举类型的功能,如枚举实例的比较和遍历,使得枚举更加实用和灵活。 4. **改进的并发工具**:Java并发包(java.util.concurrent)得到了扩展,添加了如CountDownLatch、...
java.util.concurrent包包含了一系列并发工具,如Semaphore(信号量)、CyclicBarrier(循环栅栏)和ExecutorService(执行器服务),帮助开发者更高效、安全地进行多线程编程。 以上只是《JDK API 1.8_中文文档》...
3. 多线程:Thread类和Runnable接口是实现多线程的基础,线程同步是防止数据竞争的关键,synchronized关键字和java.util.concurrent包中的工具类(如Semaphore、CyclicBarrier)提供了多种同步方式。 4. 反射:java...
它可以用于代替只有一个抽象方法的接口实例,常用于函数式编程。 2. **Stream API**:Stream API为处理集合提供了一种声明性方式,支持串行和并行操作。通过filter、map、reduce等方法,可以实现数据的过滤、转换和...
- 1.6版本强化了并发工具类库,如`java.util.concurrent`包,提供了线程池、Future、Callable和CyclicBarrier等工具,便于多线程编程。 - 1.8版本中,Fork/Join框架的引入进一步优化了并行计算,使得大型任务可以...
9. **并发改进**:JDK 8在并发方面也有所提升,如Fork/Join框架的改进,以及CountDownLatch、CyclicBarrier等并发工具类的优化。 安装"jdk-8u241-windows-x64.exe"时,通常需要遵循以下步骤: 1. 下载并解压压缩包...
JDK7增强了类型推断,引入了`钻石操作符`(`<>`),使得创建泛型实例时可以省略类型参数,编译器能够自动推断出正确的类型。 4. **字符串相关改进** 字符串处理在JDK7中得到了加强,如`String.join()`方法用于方便...
此外,Java 5引入的并发工具类如Semaphore、CyclicBarrier和CountDownLatch提供了更高级的同步机制。 4. **IO流**:Java的IO流模型基于流的概念,分为字节流(Byte Stream)和字符流(Character Stream),又有输入...
7. **并发编程**:Java 1.8的并发API包括ExecutorService、Future、Callable、CyclicBarrier、Semaphore等,它们提供了一套完善的多线程管理和同步机制。 8. **NIO.2**:Java的New I/O 2(NIO.2)引入了Path、Files...