簡介:
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