多线程之CyclicBarrier
来源:互联网 发布:架构图制作软件 知乎 编辑:程序博客网 时间:2024/05/17 23:05
简介
CyclicBarrier 的字面意思是可循环使用(Cyclic)的屏障(Barrier)。它要做的事情是,让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续干活。CyclicBarrier默认的构造方法是CyclicBarrier(int parties),其参数表示屏障拦截的线程数量,每个线程调用await方法告诉CyclicBarrier我已经到达了屏障,然后当前线程被阻塞。
await()及CyclicBarrier(int parties)构造函数
示例:
package com.example.demo.three.untils.cyclicBarrier;import java.util.concurrent.BrokenBarrierException;import java.util.concurrent.CyclicBarrier;import java.util.concurrent.TimeUnit;/** * @Author: CYM * @Description: CyclicBarrier介绍 * @Data: 2017/10/9 13:43 *//** * new CyclicBarrier(3) * 三个线程到达 cyclicBarrier.await()后,同时进行 * 下面程序 */public class CyclicBarrierTest1 { public static void main(String[] args) throws BrokenBarrierException, InterruptedException { CyclicBarrier cyclicBarrier = new CyclicBarrier(3); new Thread(){ @Override public void run() { System.out.println("==========1================="); try { cyclicBarrier.await(); System.out.println("------------1---------------"); } catch (InterruptedException e) { e.printStackTrace(); } catch (BrokenBarrierException e) { e.printStackTrace(); } } }.start(); new Thread(){ @Override public void run() { System.out.println("==========2================="); try { TimeUnit.SECONDS.sleep(5); cyclicBarrier.await(); System.out.println("------------2---------------"); } catch (InterruptedException e) { e.printStackTrace(); } catch (BrokenBarrierException e) { e.printStackTrace(); } } }.start(); cyclicBarrier.await(); System.out.println("****************************************"); }}
CyclicBarrier(int parties, Runnable barrierAction)
CyclicBarrier还提供一个更高级的构造函数CyclicBarrier(int parties, Runnable barrierAction),用于在线程到达屏障时,优先执行barrierAction,方便处理更复杂的业务场景。
示例:
package com.example.demo.three.untils.cyclicBarrier;import java.util.concurrent.BrokenBarrierException;import java.util.concurrent.CyclicBarrier;import java.util.concurrent.TimeUnit;/** * @Author: CYM * @Description: CyclicBarrier介绍 * @Data: 2017/10/9 13:43 *//** * 输出结果: * 进入Thread * ======================= * ********************************* * await()完毕 * 等待完毕 * * 1.先执行System.out.println("进入Thread"),执行到cyclicBarrier.await()时; * 2.回调,执行System.out.println("======================="),执行完回调中的方法 * 3.继续执行cyclicBarrier.await()下面的程序 */public class CyclicBarrierTest2 { public static void main(String[] args) throws BrokenBarrierException, InterruptedException { CyclicBarrier cyclicBarrier = new CyclicBarrier(1, new Runnable() { @Override public void run() { try { System.out.println("======================="); TimeUnit.SECONDS.sleep(5); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("********************************"); } }); new Thread(){ @Override public void run() { System.out.println("进入Thread"); try { TimeUnit.SECONDS.sleep(5); cyclicBarrier.await(); System.out.println("await()完毕"); TimeUnit.SECONDS.sleep(5); System.out.println("等待完毕"); } catch (InterruptedException e) { e.printStackTrace(); } catch (BrokenBarrierException e) { e.printStackTrace(); } } }.start(); TimeUnit.SECONDS.sleep(5); System.err.println(cyclicBarrier.getNumberWaiting()); System.err.println(cyclicBarrier.getParties()); System.err.println(cyclicBarrier.isBroken()); }}
CyclicBarrier和CountDownLatch区别
- CountDownLatch的计数器只能使用一次。而CyclicBarrier的计数器可以使用reset() 方法重置。所以CyclicBarrier能处理更为复杂的业务场景,比如如果计算发生错误,可以重置计数器,并让线程们重新执行一次。
- CyclicBarrier还提供其他有用的方法,比如getNumberWaiting方法可以获得CyclicBarrier阻塞的线程数量。isBroken方法用来知道阻塞的线程是否被中断。
- CountDownLatch工程线程之间互不关心,CyclicBarrier工程线程必须等到一个共同点才去执行某一动作。
阅读全文
0 0
- Java多线程之CyclicBarrier
- Java多线程之CyclicBarrier
- JAVA多线程之CyclicBarrier
- Java多线程之CyclicBarrier
- Java多线程之CyclicBarrier
- Java多线程之----CyclicBarrier
- Java 多线程之CyclicBarrier
- 多线程之CyclicBarrier
- 多线程之CyclicBarrier
- JAVA多线程之(CyclicBarrier)
- Java多线程技术之CyclicBarrier
- (九)java多线程之CyclicBarrier
- java多线程问题之同步器CyclicBarrier
- Java多线程之CyclicBarrier(一)
- Java多线程同步工具之CyclicBarrier
- 我之见--java 多线程CyclicBarrier
- Java多线程之~~~CyclicBarrier 类的使用
- java多线程之利用“CyclicBarrier”汇总结果
- 【poj 1330】 Nearest Common Ancestors 【Taejon 2002】
- DrawerLayout抽屉更新MainActivity的viewpager
- Windows根据程序标题查找正在运行的程序的HWND--判断窗口程序是否运行
- 手机号判断ios
- Oracle笔记五:单行函数
- 多线程之CyclicBarrier
- ISTQB认证考试通过秘籍 问题一、ISTQB是什么?有哪些分类? ISTQB(International Software Testing Qualification Board)是国际唯一权威的软
- 15个顶级Java多线程面试题及答案
- 8. String to Integer (atoi)
- Android指示器的使用。
- 如何让App首屏启动更快 -- httpdns持久化缓存方案
- 实验2
- HDU 6213 模拟
- 使用深度学习进行生存分析