首页 > 学院 > 开发设计 > 正文

同步类CyclicBarrier整理

2019-11-08 03:15:21
字体:
来源:转载
供稿:网友
import java.io.IOException;import java.util.Random;import java.util.concurrent.BrokenBarrierException;import java.util.concurrent.CyclicBarrier;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;/** * 一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point) * 场景:需要所有的子任务都完成时,才执行主任务,这个时候就可以选择使用CyclicBarrier *  * @author huawangxin * 2017年2月17日 下午3:00:01 * */public class TestCyclicBarrier {    PRivate static final int THREAD_NUM = 5;    public static void main(String[] args) throws IOException, InterruptedException {        // 如果将参数改为4,但是下面只加入了3个选手,这永远等待下去        // Waits until all parties have invoked await on this barrier.        CyclicBarrier barrier = new CyclicBarrier(THREAD_NUM);        ExecutorService executor = Executors.newFixedThreadPool(3);        executor.submit(new Thread(new Student(barrier, "张三")));        executor.submit(new Thread(new Student(barrier, "李四")));        executor.submit(new Thread(new Student(barrier, "王五")));        executor.shutdown();    }}class Student implements Runnable {    // 一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)    private CyclicBarrier barrier;    private String name;    public Student(CyclicBarrier barrier, String name) {        super();        this.barrier = barrier;        this.name = name;    }    @Override    public void run() {        try {            Thread.sleep(1000 * (new Random()).nextInt(8));            // barrier的await方法,在所有参与者都已经在此 barrier 上调用 await 方法之前,将一直等待。            barrier.await();            System.out.println(name + " 准备好了...");        } catch (InterruptedException e) {            e.printStackTrace();        } catch (BrokenBarrierException e) {            e.printStackTrace();        }        System.out.println(name + " 同学开始上课!");    }}
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表