CyclicBarrier的使用

    xiaoxiao2022-06-28  32

    CyclicBarrier把所有的线程都阻塞在一个阀门位置cyclicbarrier.awaite(),然后等到等待的线程数到达预设的值,就打开这个阀门。记得是阻塞线程,不是阻塞操作,在同一个线程使劲掉await是没什么效果的。

    public class CyclicBarrierTest{ private final int STUDENT_COUNT = 10; private final CyclicBarrier cb = new CyclicBarrier(STUDENT_COUNT, new Runnable() { @Override public void run() { System.out.println("人到齐了,开门...."); } }); public void goHome() throws InterruptedException, BrokenBarrierException{ System.out.println(Thread.currentThread().getName()+"已刷卡,等待开门回家~"); cb.await(); System.out.println(Thread.currentThread().getName() + "放学回家~"); } public static void main(String[] args) { CyclicBarrierTest ct = new CyclicBarrierTest(); for(int i =0;i<ct.STUDENT_COUNT;i++){ new Thread("学生"+i+" "){ @Override public void run() { try { ct.goHome(); } catch (InterruptedException | BrokenBarrierException e) { e.printStackTrace(); } } }.start(); } } } package com.zhy.concurrency.cyclic; import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CyclicBarrier; /** * 改造后的门禁系统 * * @author zhy * */ public class CyclicBarrierTest23 { /** * 学生总数 */ private final int STUDENT_COUNT = 12; /** * 每3个人一组出门 */ final CyclicBarrier barrier = new CyclicBarrier(2, new Runnable() { @Override public void run() { System.out.println("有2个学生到齐了,放行...."); } }); public void goHome() throws InterruptedException, BrokenBarrierException { System.out.println(Thread.currentThread().getName() + "已刷卡,等待开门回家~"); barrier.await(); } public static void main(String[] args) throws InterruptedException, BrokenBarrierException { final CyclicBarrierTest23 instance = new CyclicBarrierTest23(); /** * 每个线程代表一个学生 */ for (int i = 0; i < instance.STUDENT_COUNT; i++) { new Thread("学生" + i +" " ) { public void run() { try { Thread.sleep(1000); instance.goHome(); } catch (InterruptedException e) { e.printStackTrace(); } catch (BrokenBarrierException e) { e.printStackTrace(); } }; }.start(); } } }
    转载请注明原文地址: https://ju.6miu.com/read-1124563.html

    最新回复(0)