CyclicBarrier的使用

在java的线程同步器中有一个类叫做CyclicBarrier,使用这个类可以使多个线程在全部达到某种条件的情况下才能执行接下的任务。举个例子来说,田径比赛上,发令员必须等到所有的选手都准备好了之后才开枪,在任何一个运动员准备好之前,其他的运动员都是不可以抢跑的,必须等到所有的运动达到了准备状态才可以。

package com.app.async;
import java.util.concurrent.*;
/**
 * Created by joe.wang on 2016/7/21.
 */
public class CyclicBarrierMotion {
    public static void main(String[] args) {
        CyclicBarrier barrier = new CyclicBarrier(3);
        ExecutorService service = Executors.newCachedThreadPool();
        service.submit(new RunnningMan(barrier, "zhangsan"));
        service.submit(new RunnningMan(barrier, "lisi"));
        service.submit(new RunnningMan(barrier,"wangwu"));
        service.shutdown();
    }
}
class RunnningMan implements Runnable {
    private CyclicBarrier mCyclicBarrier;
    private String tagName;
    public RunnningMan(CyclicBarrier barrier, String name) {
        this.mCyclicBarrier = barrier;
        tagName = name;
    }
    @Override
    public void run() {
        try {
            Thread.sleep(1000 * (int)(Math.random() * 10));
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(tagName + " 准备好了!");
        try {
            mCyclicBarrier.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (BrokenBarrierException e) {
            e.printStackTrace();
        }
        System.out.println(tagName + "开始run!!");
    }
}

可以理解为调用了await()方法表示该线程已经准备好了,正在等待其他线程;当最后一个线程调用awit()方法时,所有的线程阻塞被解除。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值