java.util.concurrent.CyclicBarrier组件说明

一、CyclicBarrier

1、功能说明:一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier(也翻译成栅栏)。

2、注意事项:CyclicBarrier可以使一定数量的参与方反复地在栅栏位置等待,常常用于模拟并发或者进行并行迭代计算。CyclicBarrier可以重置。

3、主要方法之构造方法CyclicBarrier(int parties)参数必须大于0的整数,这表示屏障点数量。

4、主要方法之等待CyclicBarrier.awit()在所有参与者都已经在此 barrier 上调用 await 方法之前,将一直等待。

5、主要方法之CyclicBarrier.getNumberWaiting()返回当前在屏障处等待的参与者数目。
6、主要方法之CyclicBarrier.isBroken() 查询此屏障是否处于损坏状态。
7、主要方法之CyclicBarrier.reset()  将屏障重置为其初始状态。

8、如下例所示,常常用于来模拟并发,下面来模拟10个并发访问开源社区的首页。

注意:使用了第三方库(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));
	}

}

你可能感兴趣的:(java.util.concurrent.CyclicBarrier组件说明)