java并发编程回环屏障cyclicbarrier-mile米乐体育
cyclicbarrier
前面介绍的countdownlatch在解决多个线程同步方面相对于调用线程的join方法已经有了不少优化。但是countdownlatch的计数器是一次性的,也就是等到计数器值变为0后,再调用countdownlatch的await和countdown方法都会立刻返回,这就起不到线程同步的效果了。所以为了满足计数器可以重置的需要,jdk开发组提供了cyclicbarrier类,并且cyclicbarrier类的功能并不限于countdownlatch的功能。从字面意思理解 cyclicbarrier 是回环屏障的意思,它可以让一组线程全部达到一个状态后再全部同时执行。这里之所以叫作回环是因为当所有等待线程执行完毕,并重置cyclicbarrier 的状态后它可以被重用。之所以叫作屏障是因为线程调用await方法后就会被阻塞,这个阻塞点就称为屏障点,等所有线程都调用了 await方法后,线程们就会冲破屏障,继续向下运行。在介绍原理前先介绍几个实例以便加深理解。在下面的例子中,我们要实现的是,使用两个线程去执行一个被分解的任务 a,当两个线程把自己的任务都执行完毕后再对它们的结果进行汇总处理。
import java.util.concurrent.cyclicbarrier; import java.util.concurrent.executorservice; import java.util.concurrent.executors; public class cyclebarriertest { //创建一个线程数固定为2的线程池 private static cyclicbarrier cyclicbarrier = new cyclicbarrier(2, new runnable() { @override public void run() { system.out.println(thread.currentthread() " task1 merge result"); } }); public static void main(string[] args) throws interruptedexception{ executorservice executorservice = executors.newfixedthreadpool(2); //添加线程a到线程池 executorservice.submit(new runnable() { @override public void run() { try { system.out.println(thread.currentthread() "task1"); system.out.println(thread.currentthread() "enter in barrier"); cyclicbarrier.await(); system.out.println(thread.currentthread() "enter out barrier"); } catch (exception e) { e.printstacktrace(); } } }); //添加线程b到线程池 executorservice.submit(new runnable() { @override public void run() { try { system.out.println(thread.currentthread() "task2"); system.out.println(thread.currentthread() "enter in barrier"); cyclicbarrier.await(); system.out.println(thread.currentthread() "enter out barrier"); } catch (exception e) { e.printstacktraca.util.concurrent.cyclicbarrier; import java.util.concurrent.executorservice; import java.util.concurrent.executors; public class cyclebarriertest1 { //创建一个线程数固定为2的线程池 private static cyclicbarrier cyclicbarrier = new cyclicbarrier(2); public static void main(string[] args) throws interruptedexception{ executorservice executorservice = executors.newfixedthreadpool(2); //添加线程a到线程池 executorservice.submit(new runnable() { @override public void run() { try { system.out.println(thread.currentthread() "step1"); cyclicbarrier.await(); system.out.println(thread.currentthread() "step2"); cyclicbarrier.await(); system.out.println(thread.currentthread() "step3"); cyclicbarrier.await(); } catch (exception e) { e.printstacktrace(); } } }); //添加线程b到线程池 executorservice.submit(new runnable() { @override public void run() { try { system.out.println(thread.currentthread() "step1"); cyclicbarrier.await(); system.out.println(thread.currentthread() "step2"); cyclicbarrier.await(); system.out.println(thread.currentthread() "step3"); cyclicbarrier.await(); } catch (exception e) { e.printstacktrace(); } } }); //关闭线程池 executorservice.shutdown(); } }
如上代码中,每个子线程在执行完阶段1后都调用了await方法,等到所有线程都到达屏障点后才会一块往下执行,这就保证了所有线程都完成了阶段1后才会开始执行阶段2。
到此这篇关于java并发编程回环屏障cyclicbarrier的文章就介绍到这了,更多相关java 回环屏障cyclicbarrier内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!