CyclicBarrier是一個線程工具,Cyclic是循環的意思,Barrier是「路障」的意思,CyclicBarrier表示這個「路障」能夠循環使用。能夠實現的功能:表示你們彼此等待,你們集合好以後纔開始出發,分散活動後又在指定的地點集合碰面。java
CyclicBarrier所實現的功能能夠用下圖來表示:dom
經過代碼看一下CyclicBarrier的執行效果:ide
- import java.util.concurrent.CyclicBarrier;
- import java.util.concurrent.ExecutorService;
- import java.util.concurrent.Executors;
- public class CyclicBarrierTest {
- public static void main(String[] args) {
- ExecutorService service = Executors.newCachedThreadPool();
- final CyclicBarrier cb = new CyclicBarrier(3);//3個線程
- for(int i=0;i<3;i++){//建立3個線程
- Runnable runnable = new Runnable(){
- public void run(){
- try {
- Thread.sleep((long)(Math.random()*10000));//每一個線程「休息的」時間不一樣
- System.out.println("線程" + Thread.currentThread().getName() +
- "即將到達集合地點1,當前已有" + (cb.getNumberWaiting()+1) +
- "個已經到達," + (cb.getNumberWaiting()==2?"都到齊了,繼續前進":"正在等候"));
- cb.await();//先到的等待後到的,當3個都到達時纔會繼續向下執行
- Thread.sleep((long)(Math.random()*10000));//每一個線程「休息的」時間不一樣
- System.out.println("線程" + Thread.currentThread().getName() +
- "即將到達集合地點2,當前已有" + (cb.getNumberWaiting()+1) +
- "個已經到達," + (cb.getNumberWaiting()==2?"都到齊了,繼續前進":"正在等候"));
- cb.await();
- Thread.sleep((long)(Math.random()*10000));//每一個線程「休息的」時間不一樣
- System.out.println("線程" + Thread.currentThread().getName() +
- "即將到達集合地點3,當前已有" + (cb.getNumberWaiting() + 1) +
- "個已經到達,"+ (cb.getNumberWaiting()==2?"都到齊了,繼續前進":"正在等候"));
- cb.await();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- };
- service.execute(runnable);
- }
- service.shutdown();
- }
- }
程序執行的效果:工具
從上面的執行效果能夠看到,3個線程彼此等待,都到達時,纔開始執行新的任務。spa