我是靠谱客的博主 无情冬天,最近开发中收集的这篇文章主要介绍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到达终点
比赛结束

最后

以上就是无情冬天为你收集整理的Java多线程---CountDownLatch用法实例的全部内容,希望文章能够帮你解决Java多线程---CountDownLatch用法实例所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(46)

评论列表共有 0 条评论

立即
投稿
返回
顶部