api对CyclicBarrier的描述: 一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier。 也就是说他可以使一组线程先等待 然后达到某个条件之后再一起执行,有点map/reduce的感觉。
举个例子: 目前有个int, 分配3个任务线程对他加1 , 最后主任务线程汇集计算结果,代码如下:
private static AtomicInteger i = new AtomicInteger(0); public static void main(String[] args){ CyclicBarrier cb = new CyclicBarrier(3,new Runnable() { //主任务汇集计算结果 public void run() { System.out.println("结果为" + i.get()); } }); ExecutorService es = Executors.newFixedThreadPool(5); es.submit(new SubTask(cb, "线程一")); es.submit(new SubTask(cb, "线程二")); es.submit(new SubTask(cb, "线程三")); es.shutdown(); } //子任务计算 private static class SubTask implements Runnable{ private CyclicBarrier cb; private String msg; public SubTask(CyclicBarrier cb, String msg){ this.cb = cb; this.msg = msg; } public void run() { try { System.out.println(msg + " enter"); i.incrementAndGet(); Thread.sleep(1000l); cb.await(); System.out.println(msg + " quit"); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (BrokenBarrierException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
结果:
线程一 enter
线程三 enter
线程二 enter
结果为3
线程三 quit
线程二 quit
线程一 quit
时间: 2024-10-11 17:17:57