jdk5 CyclicBarrier让聚合

来源:互联网 发布:win10怎么引导ubuntu 编辑:程序博客网 时间:2024/05/17 02:37

CyclicBarrier允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待。

package com.skydream.thread.cyclicBarrier;import java.util.concurrent.BrokenBarrierException;import java.util.concurrent.CyclicBarrier;public class Runnable1 implements Runnable {private CyclicBarrier cyclicBarrier;public Runnable1(CyclicBarrier cyclicBarrier){this.cyclicBarrier = cyclicBarrier;}@Overridepublic void run() {System.out.println("this is Runnable1");try {cyclicBarrier.await();System.out.println("================");} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (BrokenBarrierException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}


 

package com.skydream.thread.cyclicBarrier;import java.util.concurrent.BrokenBarrierException;import java.util.concurrent.CyclicBarrier;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class CyclicBarrierTest {/** * @param args */public static void main(String[] args) {ExecutorService service = Executors.newCachedThreadPool();final CyclicBarrier cyclicBarrier = new CyclicBarrier(3);service.execute(new Runnable1(cyclicBarrier));for(int i=0;i<4;i++){Runnable runnable = new Runnable() {@Overridepublic void run() {try {Thread.sleep((long)(Math.random()*10000));System.out.println("这是在Runnable里");cyclicBarrier.await();System.out.println("runable await 之后");} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (BrokenBarrierException e) {// TODO Auto-generated catch blocke.printStackTrace();}}};service.execute(runnable);}}}


从运行结果可以看出三个线程到达后才继续往下运行。

原创粉丝点击