public class CountDownLatchDemo2 {
/**
* CountDownLatch:
* 以3个小组的比赛来进行分析:
* 指令员发令。它有一个计数器。计时使用。这个是为了统一
* 运行员在指令员的计数器到0之后接受到指令
* 每个运动员都有一个计数器。每个运动员在到达终点之后把
* 对应的计数器给置为0.这样指令员才能进行下一步的操作。
倒计数的记时器
它有一个初始值,我们可以调用CountDownLatch的countDown方法将计数器的值减1,
当计数器到达0时,则所有等待者或单个等待者开始执行。
比如赛跑的时候,发令员发令之前,所有的运动员都在等待发令员的发令,而发令员的
时间也是从10---0的。这也是一个计数器。到0之后,所有运动员快速冲向目标。
一个人通知多个人
多个人通知一个人 */
public static void main(String[] args) {
ExecutorService pool=Executors.newCachedThreadPool();
final CountDownLatch cd1=new CountDownLatch(1); //指令员所用的计数器
final CountDownLatch cd2=new CountDownLatch(3); //运动员所使用的计数器
String str="线程:"+Thread.currentThread().getName();
for(int i=0;i<3;i++){
Runnable run=new Runnable() {
@Override
public void run() {
try{
String str="线程:"+Thread.currentThread().getName();
System.out.println(str+"正在接受指令");
cd1.await(); //让它处于等待的状态
System.out.println(str+"接受到指令,出发.....");
Thread.sleep((long)(Math.random()*10000));
System.out.println(str+"已经到达终点");
cd2.countDown();
}catch(Exception e){
e.printStackTrace();
}
}
};
pool.execute(run);
}
try{
Thread.sleep((long)(Math.random()*10000));
System.out.println(str+"正准备下达指令");
cd1.countDown(); //把第一个计数器-1
System.out.println(str+"已下达指令");
cd2.await();
System.out.println(str+"收到结果,正在裁判");
}catch(Exception e){
e.printStackTrace();
}
}
/**
* 线程:pool-1-thread-1正在接受指令
线程:pool-1-thread-3正在接受指令
线程:pool-1-thread-2正在接受指令
线程:main正准备下达指令
线程:main已下达指令
线程:pool-1-thread-1接受到指令,出发.....
线程:pool-1-thread-3接受到指令,出发.....
线程:pool-1-thread-2接受到指令,出发.....
线程:pool-1-thread-2已经到达终点
线程:pool-1-thread-3已经到达终点
线程:pool-1-thread-1已经到达终点
线程:main收到结果,正在裁判
*/
}
《黑马程序员》 并发中的CountDownLatch同步工具类
最新推荐文章于 2024-05-10 09:23:29 发布