java5 CyclicBarrier同步工具


CyclicBarrier是一個同步輔助類,它允許一組線程互相等待,直到到達某個公共屏障點(common barrier point)。在涉及一組固定大小的線程的程序中,這些線程必須不時地互相等待,此時CyclicBarrier很有用。因為該barrier 在釋放等待線程后可以重用,所以稱它為循環的barrier。

CyclicBarrier支持一個可選的Runnable命令,在一組線程中的最后一個線程到達之后(但在釋放所有線程之前),該命令只在每個屏障點運行一次。若在繼續所有參與線程之前更新共享狀態,此屏障操作很有用。

例如:組織人員(線程)郊游,約定一個時間地點(路障),人員陸續到達地點,等所有人員全部到達,開始到公園各玩各的,再到約定時間去食堂吃飯,等所有人到齊開飯……

package com.ljq.test.thread;


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();
						
						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();
	}
}

打印結果:

線程pool-1-thread-1即將到達集合地點1,當前已有1個已經到達,正在等候
線程pool-1-thread-3即將到達集合地點1,當前已有2個已經到達,正在等候
線程pool-1-thread-2即將到達集合地點1,當前已有3個已經到達,都到齊了,繼續走啊
線程pool-1-thread-2即將到達集合地點2,當前已有1個已經到達,正在等候
線程pool-1-thread-3即將到達集合地點2,當前已有2個已經到達,正在等候
線程pool-1-thread-1即將到達集合地點2,當前已有3個已經到達,都到齊了,繼續走啊
線程pool-1-thread-2即將到達集合地點3,當前已有1個已經到達,正在等候
線程pool-1-thread-1即將到達集合地點3,當前已有2個已經到達,正在等候
線程pool-1-thread-3即將到達集合地點3,當前已有3個已經到達,都到齊了,繼續走啊

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM