CountDownLatch应用实战

1. CountDownLatch简介

       一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。其本质就是一个共享锁。

       他最主要的作用是用来同步java的线程。

主要有以下三个方法:

主要方法:

 public CountDownLatch(int count);
 public void countDown();
 public void await();

构造方法参数指定了计数的次数

countDown方法,当前线程调用此方法,则计数减一

await方法,调用此方法会一直阻塞当前线程,直到计时器的值为0

2. 实战应用的例子

         一个模拟运动员比赛的例子,首先要等所有的运动员全部给准备好,然后发起“起跑指令”所有的运动员开始起跑,等所有的运动员跑完才结束本次笔试。

代码如下:

运动员线程代码:

package it_cast.day01;
import java.util.concurrent.CountDownLatch;
public class Player implements Runnable {
    private int id;
    private CountDownLatch begin;
    private CountDownLatch end;
    
    public Player(int id, CountDownLatch begin, CountDownLatch end) {
        this.id=id;
        this.begin=begin;
        this.end=end;
    }
    
    @Override
    public void run() {
        // TODO Auto-generated method stub
        try {
                System.out.println("Play" + id + "ready");
                begin.await();// 所有的运动员在这准备者,当一声令下就开始跑
                Thread.sleep((long) (Math.random() * 100));// 随机分配时间,即运动员完成时间
                System.out.println("Play" + id + " arrived.");
            } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            end.countDown();// 每个运动员跑完,使end状态减1,最终减至0
        }        
    }
}

主代码:

package it_cast.day01;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class CountDownLatchDemo {
    private static final int PLAYER_AMOUNT = 5;
    public static void main(String[] args) throws InterruptedException {
        // TODO Auto-generated method stub
        //对于每位运动员,CountDownLatch减1后即结束比赛
        CountDownLatch begin = new CountDownLatch(1);
        
        //对于整个比赛,所有运动员结束后才算结束
        CountDownLatch end = new CountDownLatch(PLAYER_AMOUNT);
        Player [] plays=new Player[PLAYER_AMOUNT];
        
        //初始化5个运动员
        for (int i = 0; i < plays.length; i++) {
            plays[i]=new Player(i, begin, end);
        }
        
        //设置特定的线程池,大小为5
        ExecutorService exe = Executors.newFixedThreadPool(PLAYER_AMOUNT);
        for(Player p:plays)
            exe.execute(p); 
        Thread.sleep(1000);
        System.out.println("Race begins!");
        begin.countDown();
        end.await();; //等待end状态变为0,即为所有人都跑完了,即为比赛结束
        System.out.println("Race ends!");
        exe.shutdown();     
    }
}

运行结果如下:

161411_obf0_1540325.png

 

转载于:https://my.oschina.net/u/1540325/blog/603298

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值