Java 障礙器

簡介:

CyclicBarrier就象它名字的意思一樣,可看成是個障礙, 所有的線程必須到齊後才能一起通過這個障礙。

當所有的任務都達到障礙點的時候,最後的任務纔會被執行。

 DOC:

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

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

Demo:


class PartTask implements Runnable
{
	//指向障礙器的引用
	CyclicBarrier cb;
	//子任務的名稱
	String ptname;
	//代表子任務的持續時間
	int duringTime;
	//構造器
	public PartTask(CyclicBarrier cb,String ptname,int duringTime)
	{
		this.cb=cb;
		this.ptname=ptname;
		this.duringTime=duringTime;
	}
	//表示任務的方法
	public void run()
	{
		System.out.println(ptname+"子任務開始執行!!!");
		try
		{
			Thread.sleep(duringTime);
			System.out.println(ptname+"子任務執行結束!!!");
			//子任務結束,調用await方法通知障礙器
			
//			Thread.sleep(millis)
			cb.await();
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
	}
}
//表示所有子任務結束後任務的類
class FinalTask implements Runnable
{
	//表示任務的方法
	public void run()
	{
		System.out.println("最後的任務被執行!!!");
	}	
}
//主類
public class Mian
{
	public static void main(String args[])
	{
       //創建障礙器對象,並指定最後的任務
       CyclicBarrier cb=new CyclicBarrier(5,new FinalTask());
       //創建線程池對象
       ExecutorService threadPool=Executors.newFixedThreadPool(5);
       //啓動5個子任務
       for(int i=0;i<5;i++)
       {
       		threadPool.execute(new PartTask(cb,"PartTask"+i,1000+i*1000));
       }
       //關閉線程池
       threadPool.shutdown();
	}
}

ps:代碼來自《Java SE 6.0編程指南》


 

 

參考:

http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CyclicBarrier.html

http://www.cnblogs.com/techyc/archive/2013/03/13/2957059.html

http://www.blogjava.net/jlins-you/archive/2012/04/24/376516.html

http://item.jd.com/10062576.html


 

 

發佈了120 篇原創文章 · 獲贊 1 · 訪問量 27萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章