java.util.concurrent.CyclicBarrier組件說明

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

}
相關文章
相關標籤/搜索