CyclicBarrier - jdk1.5并发包

来源:互联网 发布:java 集合有哪些 编辑:程序博客网 时间:2024/05/18 08:24

什么是CyclicBarrier

CyclicBarrier是JDK 5中java.util.Concurrent包中提出的同步类。CyclicBarrier可以用来等待子任务都完成后执行最后的任务。所有的线程等待其它线程到达Barrier。CyclicBarrier初始化时指定需要等待的线程数,通过调用CyclicBarrier.await()方法,所有线程阻塞等待直到都调用了await()方法。

Java中CyclicBarrier使用例子

import java.util.concurrent.CyclicBarrier;public class CyclicBarrierTest{private static class Task implements Runnable{private CyclicBarrier barrier;public Task(CyclicBarrier barrier){this.barrier = barrier;}@Overridepublic void run(){try {                System.out.println(Thread.currentThread().getName() + " is waiting on barrier");                barrier.await();                System.out.println(Thread.currentThread().getName() + " has crossed the barrier");            } catch (Exception ex){            }        }}public static void main(String[] args) {// creating CyclicBarrier with 3 parties i.e. 3 Threads needs to call await()final CyclicBarrier cb = new CyclicBarrier(3, new Runnable(){public void run(){// This task will be executed once all thread reaches barrierSystem.out.println("All parties are arrived at barrier, lets play");}});//starting each of threadThread t1 = new Thread(new Task(cb), "Thread 1");Thread t2 = new Thread(new Task(cb), "Thread 2");Thread t3 = new Thread(new Task(cb), "Thread 3");t1.start();t2.start();t3.start();}}

output:

Thread 1 is waiting on barrier
Thread 3 is waiting on barrier
Thread 2 is waiting on barrier
All parties are arrived at barrier, lets play
Thread 2 has crossed the barrier
Thread 3 has crossed the barrier
Thread 1 has crossed the barrier

什么时候使用CyclicBarrier

考虑到CyclicBarrier的特性可以用来实现mapreduce任务,例如多玩家游戏等待所有玩家都加入后才开始游戏。

CyclicBarrier重要知识点

1.CyclicBarrier可以用于所有线程到达barrier后执行任务

2.如果CyclicBarrier初始化了3个线程,这3个线程需要调用await()方法来消除barrier

3.线程将会阻塞在await()方法直到所有线程到达barrier

参考:

1.http://javarevisited.blogspot.hk/2012/07/cyclicbarrier-example-java-5-concurrency-tutorial.html

2.http://www.cnblogs.com/skywang12345/p/3533995.html

0 0
原创粉丝点击