参考文章:http://blog.csdn.net/lmc_wy/article/details/7866863 (闭锁CountDownLatch与栅栏CyclicBarrier)
所有线程互相等待,直到大家都到达一个水平线上,大家在继续运行,这个水平线就是栅栏。
栅栏:一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点。利用栅栏,可以使线程相互等待,直到所有线程都到达某一点,然后栅栏将打开,所有线程将通过栅栏继续执行。CyclicBarrier支持一个可选的 Runnable
参数,当线程通过栅栏时,runnable对象将被调用。构造函数CyclicBarrier(int parties, Runnable barrierAction)
,当线程在CyclicBarrier对象上调用await()
方法时,栅栏的计数器将增加1,当计数器为parties
时,栅栏将打开。
import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CyclicBarrier; public class CyclicBarrierTest { public static void main(String[] args) { final int count = 5; final CyclicBarrier barrier = new CyclicBarrier(count, new Runnable() { @Override public void run() { System.out.println("大家都跑完了!"); } }); for (int i = 0; i < count; i++) { new Thread(new Worker(i, barrier)).start(); } } } class Worker implements Runnable { final int id; final CyclicBarrier barrier; public Worker(final int id, final CyclicBarrier barrier) { this.id = id; this.barrier = barrier; } @Override public void run() { try { System.out.println(this.id + "starts to run !"); Thread.sleep((long) (Math.random() * 10000)); System.out.println(this.id + "arrived !"); this.barrier.await(); //跑到这个地方等待 System.out.println(this.id+"--end--time:{"+System.currentTimeMillis()+"}"); } catch (InterruptedException e) { e.printStackTrace(); } catch (BrokenBarrierException e) { e.printStackTrace(); } } }
运行结果:
0starts to run ! 1starts to run ! 2starts to run ! 3starts to run ! 4starts to run ! 1arrived ! 4arrived ! 3arrived ! 0arrived ! 2arrived ! 大家都跑完了! 2--end--time:{1469688224243} 1--end--time:{1469688224243} 3--end--time:{1469688224243} 4--end--time:{1469688224243} 0--end--time:{1469688224243}
再来一个例子,从线程池拿5个线程,这些线程启动后同时去干一件事情,用CyclicBarrier实现
public static void main(String[] args) { final CyclicBarrier barrier=new CyclicBarrier(5); ExecutorService service= Executors.newFixedThreadPool(5); for(int i=0;i<5;i++){ service.execute(new Runnable() { @Override public void run() { try { long wait=(long)(Math.random()*10000); System.out.println(wait); Thread.sleep(wait); //模拟线程启动耗时 barrier.await(); //等待大家都启动 System.out.println("start time :"+System.currentTimeMillis()); //大家同时开始干活 } catch (Exception e) { e.printStackTrace(); } } }); } }
相关推荐
# Java中的CyclicBarrier类最全讲义 ## 1. 简介 ### 1.1 并发编程与线程协作 在现代软件开发中,特别是高性能计算领域,利用多核处理器的能力变得至关重要。为了充分利用这些硬件资源,程序员们开始广泛采用并发...
Java并发实例之CyclicBarrier的使用 CyclicBarrier是Java中的一种多线程并发控制实用工具,和CountDownLatch非常类似,它也可以实现线程间的计数等待,但是它的功能比CountDownLatch更加复杂且强大。CyclicBarrier...
CyclicBarrier是Java 5中引入的一种同步机制,用于让多个线程等待到达一个共同的屏障点,直到所有线程都到达该点后,所有线程才能继续执行。 Java多线程之CyclicBarrier的使用方法主要有以下几个方面: 1. 创建...
Java并发系列之CyclicBarrier源码分析 CyclicBarrier是Java并发系列中的一种同步工具类,用于实现一组线程相互等待。当所有线程都到达某个屏障点后,再进行后续的操作。下面是对CyclicBarrier源码的详细分析。 ...
本篇文章将详细介绍五种在Java中等待所有子线程执行完的方法。 ### 方法一:使用`sleep`方法 尽管不推荐,但可以通过`Thread.sleep()`方法让主线程休眠一段时间来等待子线程。这种方法的问题在于,睡眠时间必须预估...
Java锁机制是Java多线程编程中的核心概念之一,其主要目的是确保在多线程环境下,多个线程能够安全地访问共享资源,避免数据不一致的问题。Java锁机制的发展历经了多个版本的改进,尤其是Java 5.0引入的显示锁...
CountDownLatch适用于需要等待一组操作完成的场景,而CyclicBarrier适用于需要多个线程协同工作,直到所有线程都到达某个公共点后再一起执行的场景。在实际开发中,我们应该根据具体的应用场景选择合适的同步工具,...
在Java多线程编程中,`CyclicBarrier`是一个非常重要的同步工具类,它允许一组线程等待其他线程到达某个屏障点后再一起继续执行。这个屏障点就是我们所说的“循环栅栏”,顾名思义,它就像一个旋转门,所有线程必须...
CyclicBarrier是Java并发包(java.util.concurrent)中一个重要的同步辅助类,它的主要作用在于协调多个线程之间的协作,使得这些线程能够一起到达一个公共的“集结点”(称为屏障点)。在多线程编程中,尤其是在...
CyclicBarrier则更像一个障碍,它允许一组线程彼此等待,直到所有的线程都到达屏障点后,一起继续执行。与CountDownLatch不同,CyclicBarrier可以重置,因此可以多次使用。 1. **初始化**: 通过`CyclicBarrier(int ...
Java中的`CyclicBarrier`是一个同步辅助类,它允许一组线程互相等待,直到所有线程都到达一个公共的屏障点。这个屏障点就像一个交通信号灯,只有当所有的车辆(线程)都到达了交叉口,信号灯才会变为绿灯,允许它们...
在Java并发编程中,CountDownLatch和CyclicBarrier都是用于协调多线程间同步的重要工具,它们可以帮助开发者在特定条件满足时启动或者结束线程的执行。本文将详细探讨这两个类的内部实现机制以及它们在实际应用场景...
**CyclicBarrier** 另一方面,CyclicBarrier允许一组线程等待其他线程到达屏障点,然后一起继续执行。它的名称中的"Cyclic"表示屏障是可以重用的,即一旦所有线程都到达屏障点,屏障会被重置,线程可以再次等待。在...
Java 多线程之并发锁 Java 中的多线程编程是指在一个程序中同时运行多个线程,以提高程序的执行效率和响应速度。在多线程编程中,线程间的同步是非常重要的,因为不同的线程可能会同时访问同一个共享资源,导致数据...
CyclicBarrier 是 Java 并发库中的一种同步工具类,用于协调多个线程之间的协作,使得它们能够一起开始某个计算任务或操作。它的名称“CyclicBarrier”来源于它具有可重用的特点,即当所有等待的线程都达到指定的...
在Java编程中,线程的等待唤醒机制是多线程编程中的重要概念,它涉及到如何有效地协调多个线程之间的交互,以确保程序的正确运行。本文将深入探讨这个主题,并提供一些代码优化的建议,适合Java初学者进行学习和参考...
java.CyclicBarrier(处理方案示例).md