1、CyclicBarrierhtml
1、功能說明:一個同步輔助類,它容許一組線程互相等待,直到到達某個公共屏障點 (common barrier point)。在涉及一組固定大小的線程的程序中,這些線程必須不時地互相等待,此時 CyclicBarrier 頗有用。由於該 barrier 在釋放等待線程後能夠重用,因此稱它爲循環 的 barrier(也翻譯成柵欄)。java
2、注意事項:CyclicBarrier能夠使必定數量的參與方反覆地在柵欄位置等待,經常用於模擬併發或者進行並行迭代計算。CyclicBarrier能夠重置。node
3、主要方法之構造方法CyclicBarrier(int parties)參數必須大於0的整數,這表示屏障點數量。併發
4、主要方法之等待CyclicBarrier.awit()在全部參與者都已經在此 barrier 上調用 await 方法以前,將一直等待。ide
5、主要方法之CyclicBarrier.getNumberWaiting
()返回當前在屏障處等待的參與者數目。
6、主要方法之CyclicBarrier.isBroken()
查詢此屏障是否處於損壞狀態。
7、主要方法之CyclicBarrier.reset()
將屏障重置爲其初始狀態。url
8、以下例所示,經常用於來模擬併發,下面來模擬10個併發訪問開源社區的首頁。.net
注意:使用了第三方庫(Jsoup)來解析html線程
Jsoup下載地址:jsoup-1.7.1.jar
core library翻譯
package org.com.jsoup; import java.io.IOException; import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CountDownLatch; import java.util.concurrent.CyclicBarrier; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; public class CyclicBarrierTest { /** * 開源社區的首頁地址 */ public final static String OSCHINA_HOME_PAGE = "http://www.oschina.net/"; public static void getOschinaPage(final String url) throws IOException{ //用了Jsoup庫來解析html Document doc = Jsoup.connect(url).get(); System.out.println( doc.html().toString()); Element content = doc.getElementById("M_A_home_items"); if (content != null){ Elements links = content.getElementsByTag("A"); for (Element link : links) { String linkHref = link.attr("href"); String linkText = link.text(); System.out.println(String.format("href地址:%s", linkHref)); System.out.println(String.format("a字符:%s", linkText)); } } } /** * @param args * @throws InterruptedException */ public static void main(String[] args) throws InterruptedException { //開始時間 long beginTime = System.nanoTime(); final int theadMax = 10; //建立一個線程池,限制爲最多theadMax個線程 final ExecutorService exec = Executors.newFixedThreadPool(theadMax); //建立柵欄,指定數量爲theadMax final CyclicBarrier cyclicBarrier = new CyclicBarrier(theadMax); //建立鎖存器,設置爲theadMax個,表示要等待theadMax個線程執行完 final CountDownLatch downLatch = new CountDownLatch(theadMax); for(int i=0;i<theadMax;i++){ Runnable runable = new Runnable(){ @Override public void run() { try { //排隊等待 cyclicBarrier.await(); System.out.println(String.format("線程:%s開始執行,當時時間:%d", Thread.currentThread().getName(),System.nanoTime())); //要執行的業務邏輯 getOschinaPage(OSCHINA_HOME_PAGE); } catch (IOException e) { //處理異常 } catch (InterruptedException e) { //處理異常 } catch (BrokenBarrierException e) { //處理異常 }finally{ //減小計數值 System.out.println(String.format("線程:%s執行完成,當時時間:%d", Thread.currentThread().getName(),System.nanoTime())); downLatch.countDown(); } } }; //將任務放入線程池執行 exec.execute(runable); } downLatch.await();//等待全部的併發訪問完 exec.shutdown();//關閉線程池 System.out.println("執行完畢:" +( System.nanoTime() -beginTime)); } }