含义
栅栏允许两个或者多个线程在某个集合点同步。当一个线程到达集合点时,它将调用await()方法等待其它的线程。线程调用await()方法后,CyclicBarrier将阻塞这个线程并将它置入休眠状态等待其它线程的到来。等最后一个线程调用await()方法时,CyclicBarrier将唤醒所有等待的线程然后这些线程将继续执行。CyclicBarrier可以传入另一个Runnable对象作为初始化参数。当所有的线程都到达集合点后,CyclicBarrier类将Runnable对象作为线程执行。
方法
await():使线程置入休眠直到最后一个线程的到来之后唤醒所有休眠的线程
代码实现
原理:设置赛马集合点(线程启动需要一些时间),然后一起赛跑
package org.java;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors;import org.junit.Test;
public class TestCyclic {
public void test01() { int count = 10;//线程数 CyclicBarrier cyclicBarrier = new CyclicBarrier(count); ExecutorService executorService = Executors.newFixedThreadPool(count); int n = 0; for (int i = 0; i < count; i++) {executorService.execute(new TestCyclic().new Task(cyclicBarrier, n));
n++; } executorService.shutdown(); // 关闭线程池 // 判断是否所有的线程已经运行完 while (!executorService.isTerminated()) { try { // 所有线程池中的线程执行完毕,执行后续操作 // TODO System.out.println(“==============is sleep============”); Thread.sleep(10000); System.out.println(“==============is wake============”);} catch (InterruptedException e) {
e.printStackTrace(); } } }public class Task implements Runnable {
private CyclicBarrier cyclicBarrier; int n = 0;public Task(CyclicBarrier cyclicBarrier, int n) {
this.cyclicBarrier = cyclicBarrier; this.n = n; } public void run() { try { // 等待所有任务准备就绪 System.out.println(“赛马” + n + “到达栅栏前”); cyclicBarrier.await(); System.out.println(“赛马” + n + “开始跑”); // 测试内容 System.out.println(“hello: ” + n); } catch (Exception e) { e.printStackTrace(); } } } }
运行代码结果如下:
==============is sleep============
赛马0到达栅栏前 赛马1到达栅栏前 赛马3到达栅栏前 赛马2到达栅栏前 赛马4到达栅栏前 赛马5到达栅栏前 赛马7到达栅栏前 赛马6到达栅栏前 赛马8到达栅栏前 赛马9到达栅栏前 赛马9开始跑 赛马8开始跑 hello: 8 赛马6开始跑 hello: 6 赛马7开始跑 hello: 7 赛马0开始跑 hello: 0 赛马5开始跑 hello: 5 赛马4开始跑 hello: 4 赛马2开始跑 hello: 2 赛马3开始跑 hello: 3 赛马1开始跑 hello: 1 hello: 9 ==============is wake============