一、CyclicBarrier
1、功能说明:一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier(也翻译成栅栏)。
2、注意事项:CyclicBarrier可以使一定数量的参与方反复地在栅栏位置等待,常常用于模拟并发或者进行并行迭代计算。CyclicBarrier可以重置。
3、主要方法之构造方法CyclicBarrier(int parties)参数必须大于0的整数,这表示屏障点数量。
4、主要方法之等待CyclicBarrier.awit()在所有都已经在此 barrier 上调用 await 方法之前,将一直等待。
5、主要方法之CyclicBarrier.()返回当前在屏障处等待的参与者数目。
()
查询此屏障是否处于损坏状态。 7、主要方法之CyclicBarrier.()
将屏障重置为其初始状态。 8、如下例所示,常常用于来模拟并发,下面来模拟10个并发访问开源社区的首页。
注意:使用了第三方库(Jsoup)来解析html
Jsoup下载地址: 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