网站首页seo关键词布局,网站怎么做熊掌号,如东网站开发,cms是哪家公司CyclicBarrier#xff08;循环屏障#xff09; 直译为可循环使用#xff08;Cyclic#xff09;的屏障#xff08;Barrier#xff09;。它可以让一组线程到达一个屏障#xff08;同步点#xff09;时被阻塞#xff0c;直到最后一个线程到达屏障时#xff0c;屏障才会开…CyclicBarrier循环屏障 直译为可循环使用Cyclic的屏障Barrier。它可以让一组线程到达一个屏障同步点时被阻塞直到最后一个线程到达屏障时屏障才会开门所有被屏障拦截的线程才会继续工作
CyclicBarrier构造函数
public CyclicBarrier(int parties);//parties表示屏障拦截的线程数量
public CyclicBarrier(int parties, Runnable barrierAction);//parties表示屏障拦截的线程数量,在线程到达屏障时优先执行barrierAction
应用场景 CyclicBarrier可以用于多线程计算数据最后合并计算结果的应用场景。比如现在需要计算10个人12个月内的工资详细可以将线程分为10个分别计算每个人的工资最后再用barrierAction将这些线程的计算结果进行整合得出最后结果。
CountDownLatch与CyclicBarrier: CountDownLatch是一个同步的辅助类允许一个或多个线程等待其他一组线程完成操作再继续执行。 CyclicBarrier是一个同步的辅助类允许一组线程相互之间等待达到一个共同点再继续执行。 区别:
CountDownLatch的计数器只能使用一次。而CyclicBarrier的计数器可以使用reset() 方法重置。所以CyclicBarrier能处理更为复杂的业务场景比如如果计算发生错误可以重置计数器并让线程们重新执行一次CyclicBarrier还提供getNumberWaiting(可以获得CyclicBarrier阻塞的线程数量)、isBroken(用来知道阻塞的线程是否被中断)等方法。CountDownLatch会阻塞主线程CyclicBarrier不会阻塞主线程只会阻塞子线程。
代码实例 假设要分别计算员工1和员工2的工资并在都计算完之后进行整合操作代码实现逻辑如下
package com.concurrency.yuxin.demo;import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;public class CyclicBarrierDemo {public static void main(String[] args) throws InterruptedException{CyclicBarrier cyclicBarrier new CyclicBarrier(2, new Runnable() {Overridepublic void run() {System.out.println(汇总已分别计算出的两个员工的工资);}});Thread thread1 new Thread(new Runnable() {Overridepublic void run() {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(计算出员工1的工资);try {cyclicBarrier.await();} catch (InterruptedException e) {e.printStackTrace();} catch (BrokenBarrierException e) {e.printStackTrace();}}}, thread1);Thread thread2 new Thread(new Runnable() {Overridepublic void run() {try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(计算出员工2的工资);try {cyclicBarrier.await();} catch (InterruptedException e) {e.printStackTrace();} catch (BrokenBarrierException e) {e.printStackTrace();}}}, thread2);thread1.start();thread2.start();System.out.println(end);}}
输出结果
end
计算出员工1的工资
计算出员工2的工资
汇总已分别计算出的两个员工的工资
从输出结果可以看出 1. 主线程未被阻塞 2. barrierAction在各线程执行结束之后触发