Java多线程---CountDownLatch用法实例

java中,除了传统的wait()、notify()、notifyAll()外,还有一个CountDownLatch类,此法相比上述三个,是程序更加易懂。特别是需要某线程需要依赖其他线程执行时,可以使用该类。

其中最关键的方法是:
countDown(),使得计数器-1;
await() 方法,当计数器不为0时,则调用该方法的线程阻塞;当计数器为0时,可以唤醒等待的一个或者全部线程。

具体代码如下:

package com.wayne;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Race {

    public static void main(String[] args) throws Exception {

        CountDownLatch runnerPrepareLatch = new CountDownLatch(1);
        CountDownLatch commanderPrepareLatch = new CountDownLatch(10);

        CountDownLatch runnerRunLatch = new CountDownLatch(1);
        CountDownLatch commanderRunlatch = new CountDownLatch(10);

        System.out.println("选手们进场");

        ExecutorService service = Executors.newCachedThreadPool();

        System.out.println("裁判员发出准备指令");
        runnerPrepareLatch.countDown();

        for(int i = 0;i<10;i++) {
            final int j = i;

            service.submit(new Runnable() {

                @Override
                public void run() {
                    System.out.println("运动员"+j+"进行准备");
                    try {
                        runnerPrepareLatch.await();
                        Thread.sleep((long)(Math.random()*1000));
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } finally {
                        System.out.println("运动员"+j+"准备完成");
                        commanderPrepareLatch.countDown();
                    }

                    try {
                        runnerRunLatch.await();
                        long time = (long)(Math.random()*1000);
                        Thread.sleep(time);
                        System.out.println("经历"+time+"秒");
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } finally {
                        commanderRunlatch.countDown();
                        System.out.println("运动员"+j+"到达终点");
                    }
                }
            });
        }

        commanderPrepareLatch.await();
        System.out.println("都准备好,裁判员发出开始指令");
        runnerRunLatch.countDown();
        commanderRunlatch.await();
        System.out.println("比赛结束");


        service.shutdown();
    }
}


输出结果

选手们进场
裁判员发出准备指令
运动员0进行准备
运动员1进行准备
运动员2进行准备
运动员3进行准备
运动员4进行准备
运动员5进行准备
运动员7进行准备
运动员9进行准备
运动员8进行准备
运动员6进行准备
运动员0准备完成
运动员7准备完成
运动员1准备完成
运动员8准备完成
运动员4准备完成
运动员5准备完成
运动员6准备完成
运动员2准备完成
运动员3准备完成
运动员9准备完成
都准备好,裁判员发出开始指令
经历41秒
运动员3到达终点
经历114秒
运动员0到达终点
经历161秒
运动员5到达终点
经历278秒
运动员7到达终点
经历283秒
运动员2到达终点
经历394秒
运动员4到达终点
经历414秒
运动员8到达终点
经历417秒
运动员6到达终点
经历925秒
运动员9到达终点
经历963秒
运动员1到达终点
比赛结束

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值