CyclicBarrier 类

CyclicBarrier

CyclicBarrier 就像它的解释一样,可以看成是个障碍,所有的线程必须到期后才能一起通过这个障碍。

常用方法
  1. CyclicBarrier(int parties) 初始化时规定一个数目,然后计算调用了 await() 进入等待的线程数。当线程数达到了这个数目时,所有进入等待状态的线程都被唤醒并继续。
  2. CyclicBarrier(int parties, Runnable barrierAction) 初始化时带入一个Runnable的参数,此Runnable任务在CyclicBarrier的数目达到后,所有其他线程被唤醒前执行。
  3. await() 休眠等待。 等待所有人到达。
CyclicBarrier(int parties) 使用
package cn.lvhaosir;

import java.util.Random;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

class Write implements Runnable {
    CyclicBarrier cyclicBarrier;
    String name;

    public Write(CyclicBarrier cyclicBarrier,String name) {
        this.cyclicBarrier = cyclicBarrier;
        this.name = name;
    }

    @Override
    public void run() {
        try {
            System.out.println(name+"学生到达教师...等待考试");
            // 等待班上的学生到到期
            cyclicBarrier.await();
            // 开始考试,每个人做题时间不同
            System.out.println(name+"学生正在做题...");
            Thread.sleep(new Random().nextInt(1000));
            // 这次考试,需等待所有同学都写完才交卷
            System.out.println(name+"学生,题目已经写完...等待其他同学");
            // 等待同学们都做完然后交卷
            cyclicBarrier.await();
            System.out.println(name+"学生交卷...");
        } catch (InterruptedException e1) {
            e1.printStackTrace();
        } catch (BrokenBarrierException e1) {
            e1.printStackTrace();
        }
    };
}
public class Test003 {
    public static void main(String[] args) {
        // 创建全班人数 5 人
        CyclicBarrier cyclicBarrier = new CyclicBarrier(5);
        for (int i = 1; i <= 5; i++) {
            // 创建同学
            new Thread(new Write(cyclicBarrier,"学生"+i)).start();
        }
    }
}
/**
学生2学生到达教师...等待考试
学生4学生到达教师...等待考试
学生1学生到达教师...等待考试
学生5学生到达教师...等待考试
学生3学生到达教师...等待考试
学生3学生正在做题...
学生2学生正在做题...
学生4学生正在做题...
学生1学生正在做题...
学生5学生正在做题...
学生3学生,题目已经写完...等待其他同学
学生5学生,题目已经写完...等待其他同学
学生2学生,题目已经写完...等待其他同学
学生4学生,题目已经写完...等待其他同学
学生1学生,题目已经写完...等待其他同学
学生1学生交卷...
学生3学生交卷...
学生5学生交卷...
学生2学生交卷...
学生4学生交卷...
*/
CyclicBarrier(int parties, Runnable barrierAction) 使用
package cn.lvhaosir;

import java.util.Random;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

class Write1 implements Runnable {
    CyclicBarrier cyclicBarrier;
    String name;

    public Write1(CyclicBarrier cyclicBarrier,String name) {
        this.cyclicBarrier = cyclicBarrier;
        this.name = name;
    }

    public Write1(String name) {
        super();
        this.name = name;
    }

    @Override
    public void run() {
        try {
            System.out.println(name+"学生到达教师...等待考试");
            // 等待班上的学生到到期
            cyclicBarrier.await();
            // 开始考试,每个人做题时间不同
            System.out.println(name+"学生正在做题...");
            Thread.sleep(new Random().nextInt(1000));
            // 这次考试,需等待所有同学都写完才交卷
            System.out.println(name+"学生,题目已经写完...等待其他同学");
            // 等待同学们都做完然后交卷
            cyclicBarrier.await();
            System.out.println(name+"学生交卷...");
        } catch (InterruptedException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        } catch (BrokenBarrierException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
    };
}
class Read1 implements Runnable {
    @Override
    public void run() {
        System.out.println("所有人都同步了,检查一下信息...");
    }
}
public class CopyOfTest003 {
    public static void main(String[] args) {

        CyclicBarrier cyclicBarrier = new CyclicBarrier(5,new Read1());

        for (int i = 1; i <= 5; i++) {
            new Thread(new Write1(cyclicBarrier,"学生"+i)).start();
        }
    }
}
/** 结果:
学生1学生到达教师...等待考试
学生5学生到达教师...等待考试
学生4学生到达教师...等待考试
学生3学生到达教师...等待考试
学生2学生到达教师...等待考试
所有人都同步了,检查一下信息...
学生4学生正在做题...
学生1学生正在做题...
学生5学生正在做题...
学生3学生正在做题...
学生2学生正在做题...
学生3学生,题目已经写完...等待其他同学
学生4学生,题目已经写完...等待其他同学
学生5学生,题目已经写完...等待其他同学
学生2学生,题目已经写完...等待其他同学
学生1学生,题目已经写完...等待其他同学
所有人都同步了,检查一下信息...
学生1学生交卷...
学生3学生交卷...
学生4学生交卷...
学生5学生交卷...
学生2学生交卷...
 */
转载请附上原文链接,有问题请留言,谢谢支持。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值