`

concurrent: CyclicBarrier

 
阅读更多
package component;
import java.util.Random;
import java.util.concurrent.CyclicBarrier;
/**
 * 1.CyclicBarrier类似于CountDownLatch也是个计数器,<br>
 * 2.不同的是CyclicBarrier数的是调用了CyclicBarrier.await()进入等待的线程数,
 * 3.当线程数达到了CyclicBarrier初始时规定的数目时,所有进入等待状态的线程被唤醒并继续。
 * 4.CyclicBarrier就象它名字的意思一样,可看成是个障碍,
 * 5.所有的线程必须到齐后才能一起通过这个障碍。
 * 6.CyclicBarrier初始时还可带一个Runnable的参数,此Runnable任务在CyclicBarrier的数目达到后,所有其它线程被唤醒前被执行。而且是先执行这个任务,才执行换醒的线程
 */
public class CyclicBarrierTest {

	public static class ComponentThread implements Runnable {
		CyclicBarrier barrier;// 计数器
		int ID;	// 组件标识
		int[] array;	// 数据数组

		// 构造方法
		public ComponentThread(CyclicBarrier barrier, int[] array, int ID) {
			this.barrier = barrier;
			this.ID = ID;
			this.array = array;
		}

		public void run() {
			try {
				array[ID] = new Random().nextInt(100);
				System.out.println("Component " + ID + " generates: " + array[ID]);
				// 在这里等待Barrier处
				System.out.println("Component " + ID + " sleep...");
				barrier.await();
				System.out.println("Component " + ID + " awaked...");
				// 计算数据数组中的当前值和后续值
				int result = array[ID] + array[ID + 1];
				System.out.println("Component " + ID + " result: " + result);
			} catch (Exception ex) {
			}
		}
	}
	/**
	 * 测试CyclicBarrier的用法
	 */
	public static void testCyclicBarrier() {
		final int[] array = new int[3];
		CyclicBarrier barrier = new CyclicBarrier(2, new Runnable() {
			// 在所有线程都到达Barrier时执行
			public void run() {
				System.out.println("testCyclicBarrier run...");
				array[2] = array[0] + array[1];
			}
		});

		// 启动线程
		new Thread(new ComponentThread(barrier, array, 0)).start();
		new Thread(new ComponentThread(barrier, array, 1)).start();
	}

	public static void main(String[] args) {
		CyclicBarrierTest.testCyclicBarrier();
	}
}

 

运行结果如下:

Component 0 generates: 32
Component 0 sleep...
Component 1 generates: 15
Component 1 sleep...
testCyclicBarrier run...
Component 1 awaked...
Component 1 result: 62
Component 0 awaked...
Component 0 result: 47
 

分享到:
评论

相关推荐

    backport-util-concurrent-3.1.jar和geronimo-stax-api_1.0_spec-1.0.1.jar

    它提供了与Java 5及更高版本相同的并发工具类,如线程池、Future、CyclicBarrier等。这些工具可以提高多线程应用程序的性能和可维护性,尤其是在处理大量并发任务时。如果Eclipse Axis2 Codegen插件在旧版本的JDK上...

    Concurrent:用于展示竞争名单

    在这个项目中,可能包含了实现并发控制策略的不同代码示例,如使用`ReentrantLock`、`Semaphore`、`CyclicBarrier`等工具,或者展示了如何使用`ExecutorService`来管理和调度线程。 总的来说,这个主题涵盖了Java...

    concurrent:并行处理 Java 示例

    此外,Java并发工具类还包括`CountDownLatch`(计数器门限锁)、`CyclicBarrier`(循环屏障)和`Semaphore`(信号量),它们常用于协调多个线程间的同步。 在`concurrent-master`这个压缩包中,可能包含了各种并行...

    concurrent:java并发编程的示例和原始代码分析

    1. **Java并发API**: 这个资源可能涵盖了Java的并发库,包括`java.util.concurrent`包中的类和接口,如`ExecutorService`, `Future`, `Callable`, `ThreadLocal`, `Semaphore`, `CyclicBarrier`, `CountDownLatch`, ...

    javaconcurrent源码-java_concurrent:javaconcurrent包源代码学习,及相关实践示例

    4. **CyclicBarrier**: 与CountDownLatch类似,但CyclicBarrier可以重用,当所有线程到达屏障点时,所有线程都会一起继续执行。 5. **Semaphore**: 信号量用于控制同时访问特定资源的线程数量,通过维护一个许可...

    java-concurrent:java 并发编程例子

    `CyclicBarrier`(循环栅栏)让一组线程等待彼此到达某个点后再继续。 在`java-concurrent-master`这个项目中,你可能会看到各种示例代码,展示如何使用上述组件来解决并发问题,例如线程池的创建和使用,线程间的...

    ao-concurrent:并发编程实用程序

    - **CyclicBarrier**和**CountDownLatch**:协调多个线程的同步,如等待所有线程到达某个点后继续执行。 - **Semaphore**:信号量,用于限制同时访问特定资源的线程数量。 4. **并发容器** - **...

    java-concurrent:Java并发

    `java.util.concurrent`包还提供了许多并发工具类,如`CountDownLatch`(倒计时器)、`CyclicBarrier`(循环屏障)、`Semaphore`(信号量)和`Phaser`(可重用分阶段屏障),这些工具类可以帮助协调多个线程间的...

    java-concurrent:java中的并发

    - **CyclicBarrier(循环栅栏)**:允许一组线程等待彼此到达一个公共屏障点,然后一起继续执行。常用于并发测试或多阶段计算。 - **CountDownLatch(倒计时 latch)**:一次性的同步工具,允许一个或多个线程等待...

    learn_concurrent:并发,并行

    2. **Executor框架**:Java 5引入了`java.util.concurrent`包,其中的`ExecutorService`接口和其实现如`ThreadPoolExecutor`,提供了更灵活的线程管理和调度方式。通过这个框架,我们可以控制线程池的大小,避免大量...

    java高并发源码-java-concurrent:Java高并发,JUC,相关源码。1、马士兵高并发视频源码(听课时练习)

    "java-concurrent"这个项目显然聚焦于Java并发编程的实践与学习,特别是通过马士兵老师的高并发视频课程的源码进行深入研究。JUC,全称Java Util Concurrency,是Java平台标准版(Java SE)的一部分,提供了丰富的...

    Java中的CyclicBarrier类最全讲义

    `CyclicBarrier`是Java并发工具包(`java.util.concurrent`)中的一个强大工具。它的主要作用是在一组线程中设置一个公共的“屏障”点。所有线程都需要到达这个点后,才能一起继续执行。这意味着只有当所有参与的...

    CyclicBarrier的用法

    在Java的`java.util.concurrent`包中,`CyclicBarrier`提供了以下主要功能: 1. **初始化**: `CyclicBarrier`可以通过传递两个参数来创建,第一个参数是参与等待的线程数量,第二个参数是一个可选的`Runnable`动作...

    backport-util-concurrent(2.2 /3.1)

    - 在3.1版本中,backport-util-concurrent引入了Phaser,这是一个可重用的同步帮助器类,支持多个参与者之间的有界同步,类似于CyclicBarrier和CountDownLatch,但更灵活。Phaser可以自动调整参与者的数量,并且在...

    concurrent-1.3.4.jar

    同步工具类:concurrent包提供了一些同步工具类,如CountDownLatch、CyclicBarrier、Semaphore等,可以帮助开发者实现复杂的线程协作和同步任务。 并发集合类:concurrent包提供了一些并发集合类,如...

    CountDownLatch和CyclicBarrier用法实例大全

    这两个工具都是在`java.util.concurrent`包下,是Java并发库的重要组成部分。 **CountDownLatch** CountDownLatch是一个计数器,初始化时设定一个计数值,线程在执行任务之前会调用`countDown()`方法来减小计数值,...

    Java中的CountDownLatch与CyclicBarrier:深入理解与应用实践

    在Java的并发编程中,CountDownLatch和CyclicBarrier是两个非常重要的同步工具,它们用于协调多个线程的执行顺序。本文将详细介绍CountDownLatch和CyclicBarrier的工作原理、使用场景以及如何在实际项目中应用它们。...

    MemberIdsSection.rar_unknown

    在Java并发库中,`java.util.concurrent.CyclicBarrier`是一个同步辅助类,它允许一组线程等待彼此到达一个公共屏障点。这个屏障点在所有线程都到达之后才会被释放,从而允许所有线程继续执行。`CyclicBarrier`这个...

    java并发工具包 java.util.concurrent中文版用户指南pdf

    13. 栅栏 CyclicBarrier 14. 交换机 Exchanger 15. 信号量 Semaphore 16. 执行器服务 ExecutorService 17. 线程池执行者 ThreadPoolExecutor 18. 定时执行者服务 ScheduledExecutorService 19. 使用 ForkJoinPool ...

    concurrent-1.3.4-sources.jar

    5. **CyclicBarrier和Semaphore**:这两个类是同步辅助工具,CyclicBarrier用于一组线程互相等待,直到所有线程都到达屏障点后才能继续执行;Semaphore则用于限制同时访问特定资源的线程数量,常用于限流和保护共享...

Global site tag (gtag.js) - Google Analytics