`
AliKevin2011
  • 浏览: 119093 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

JDK-CountDownLatch

    博客分类:
  • JDK
阅读更多
AliKevin 写道
CountDownLatch位于java.util.concurrent包中,它是一个通用同步工具,它有很多用途。我们利用将CountDownLatch要进行初始化,用1初始化的 CountDownLatch 用作一个简单的开/关锁存器或入口然后在通过调用 countDown() 的线程打开入口前,所有调用 await 的线程都一直在入口处等待。用 N 初始化的 CountDownLatch 可以使一个线程在 N 个线程完成某项操作之前一直等待,或者使其在某项操作完成 N 次之前一直等待。


用法示例:   我们假定一个短跑比赛的场景,裁判员会有两个信号:
    第一个信号在运动员做好准备的时候发送给运动员一个起跑的信号,等待裁判起跑信号的运动员会一起起跑。
    第二个信号是裁判员要根据所有参赛运动员给出跑完的信号后宣布比赛结束。

1.Referee.java
package study.java.util.concurrent.CountDownLatch.demo2;

import java.util.concurrent.CountDownLatch;

/**
 * TODO Comment of Referee
 *
 * @author AliKevin
 */
public class Referee implements Runnable {

    private CountDownLatch startSignal;
    private CountDownLatch finishSignal;

    /**
     * @param startSignal
     * @param finishSignal
     */
    public Referee(CountDownLatch startSignal, CountDownLatch finishSignal) {
        this.startSignal = startSignal;
        this.finishSignal = finishSignal;
    }

    /*
     * (non-Javadoc)
     * @see java.lang.Runnable#run()
     */
    @Override
    public void run() {
        System.out.println("Referee say:start run ...");
        this.startSignal.countDown();
        try {
            this.finishSignal.await();
            System.out.println("Referee say:match finish...");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }

}




2.Player.java

package study.java.util.concurrent.CountDownLatch.demo2;

import java.util.Random;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;

/**
 * TODO Comment of Player
 *
 * @author AliKevin
 */
public class Player implements Runnable {
    private int            playerNum;
    private CountDownLatch startSignal;
    private CountDownLatch finishSignal;

    /**
     * @param startSignal
     * @param finishSignal
     */
    public Player(CountDownLatch startSignal, CountDownLatch finishSignal, int playerNum) {
        this.startSignal = startSignal;
        this.finishSignal = finishSignal;
        this.playerNum = playerNum;
    }

    /*
     * (non-Javadoc)
     * @see java.lang.Runnable#run()
     */
    @Override
    public void run() {
        try {
            System.out.println("player " + this.playerNum + " is ready to run ...");
            startSignal.await();
            System.out.println("player " + this.playerNum + " is begin to run ...");
            TimeUnit.SECONDS.sleep(new Random().nextInt(10));
            System.out.println("player " + this.playerNum + " is finish ...");
            finishSignal.countDown();
            } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }
}

3.Match.java

package study.java.util.concurrent.CountDownLatch.demo2;

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

/**
 * TODO Comment of Match
 *
 * @author AliKevin
 */
public class Match {

    /**
     * @param args
     */
    public static void main(String[] args) {
        try {
            ExecutorService executor = Executors.newCachedThreadPool();
            int start = 1;
            int finish = 10;
            CountDownLatch startSignal = new CountDownLatch(start);
            CountDownLatch finishSignal = new CountDownLatch(finish);

            Referee referee = new Referee(startSignal, finishSignal);
            for (int i = 1; i <= finish; i++) {
                executor.execute(new Player(startSignal, finishSignal, i));
                Thread.sleep(1000);
            }
            executor.execute(referee);
            Thread.sleep(10000);
            executor.shutdown();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }
}



4.运行显示结果

player 1 is ready to run ...
player 2 is ready to run ...
player 3 is ready to run ...
player 4 is ready to run ...
player 5 is ready to run ...
player 6 is ready to run ...
player 7 is ready to run ...
player 8 is ready to run ...
player 9 is ready to run ...
player 10 is ready to run ...
Referee say:start run ...
player 1 is begin to run ...
player 3 is begin to run ...
player 6 is begin to run ...
player 7 is begin to run ...
player 9 is begin to run ...
player 2 is begin to run ...
player 10 is begin to run ...
player 8 is begin to run ...
player 5 is begin to run ...
player 2 is finish ...
player 4 is begin to run ...
player 8 is finish ...
player 7 is finish ...
player 5 is finish ...
player 10 is finish ...
player 1 is finish ...
player 6 is finish ...
player 4 is finish ...
player 9 is finish ...
player 3 is finish ...
Referee say:match finish...

分享到:
评论

相关推荐

    java-jdk1.6-jdk-6u45-windows-x64.zip

    4. 并发工具:提供了一些新的并发工具类,如`java.util.concurrent`包下的`CountDownLatch`、`CyclicBarrier`和`Phaser`,这些工具帮助开发者更高效地管理多线程程序。 5. JDBC增强:JDBC API进行了扩展,增加了对...

    jdk-6u45-linux-x64.bin

    5. **并发工具类库**:Java并发工具包(java.util.concurrent)在1.6版本中得到加强,增加了如`CountDownLatch`、`CyclicBarrier`、`Semaphore`等同步工具,便于多线程编程。 6. **XPath和XML处理**:JDK 1.6改进了...

    jdk-8u291-windows-x64.rar

    8. **并发改进**:对并发工具类进行了增强,如Fork/Join框架和CountDownLatch,提升了多线程编程的便利性。 **二、安装与配置JDK 8** 1. **下载**:在Oracle官方网站上,你可以找到对应操作系统的JDK 8版本,例如...

    jdk-9_doc-api-google.zip

    3. **并发编程**:Java的并发库提供了一组高级的并发工具,如ExecutorService、Future、CountDownLatch等,帮助开发者编写高效、安全的多线程程序。JDK 9增强了CompletableFuture,添加了更多的组合和转换方法。 4....

    bit-jdk-8u5-windows-i586.rar

    9. **并发改进**:包括Fork/Join框架的完善,新的CountDownLatch和ParallelArray类,以及对ConcurrentHashMap的增强,使得多线程编程更为高效。 10. **模块系统**:Jigsaw项目虽然在JDK 8中并未完全实现,但它是...

    jdk-8u341-windows-i586

    9. **并发改进**:包括`Fork/Join`框架、`Parallel Streams`和`CountDownLatch`的增强。 安装JDK 8u341后,为了使用它,你需要在系统环境变量中设置`PATH`和`JAVA_HOME`。`JAVA_HOME`应指向JDK的安装目录,而`PATH`...

    jdk-6u41-linux-x64 64位

    7. **并发工具**:Concurrent包得到了扩展,新增了`ConcurrentHashMap`,`CountDownLatch`,`CyclicBarrier`等线程同步和协作工具。 8. **垃圾收集器改进**:JDK 6中的垃圾收集器在性能和内存管理上有了显著提升,...

    jdk-8u291-windows-x64

    7. 并发改进:包括新的Fork/Join框架,改进的并发工具如CountDownLatch和CompletableFuture,以及新的并发集合类,如ConcurrentHashMap的优化。 8. Type注解:允许在类型使用时(如参数、返回值、字段和局部变量)...

    jdk-7-i586

    7. **并发工具升级**:并发包`java.util.concurrent`中的工具类如CountDownLatch、CyclicBarrier等得到了增强,提升了多线程编程的效率。 8. **动态语言支持**:JDK 7引入了 invokedynamic 指令,为运行时绑定方法...

    jdk-8u241-windows-x64.rar

    9. **并发改进**:JDK 8在并发方面也有所提升,如Fork/Join框架的改进,以及CountDownLatch、CyclicBarrier等并发工具类的优化。 安装"jdk-8u241-windows-x64.exe"时,通常需要遵循以下步骤: 1. 下载并解压压缩包...

    jdk-6u45-windows-x64

    8. **并发工具**:并发包`java.util.concurrent`得到了进一步扩充,新增了如`Phaser`、`CountDownLatch`和`CyclicBarrier`等高级同步工具。 9. **脚本引擎支持**:JDK 1.6引入了JSR 223,支持多种脚本语言,如...

    jdk-8-windows-x64.rar

    9. 并发改进:包括新的Fork/Join框架、并发集合的优化,以及对CountDownLatch和CyclicBarrier等并发工具类的增强。 10. 其他小改进:比如更强大的switch语句、新的钻石操作符自动类型推断、try-with-resources语句...

    java api文档jdk-6u30-apidocs

    `Thread`类允许创建和管理线程,而`java.util.concurrent`包提供了一套高效的并发工具,如`ExecutorService`、`Semaphore`和`CountDownLatch`,有助于简化多线程环境下的同步和协调。 4. **网络编程**:`java.net`...

    JDK官方网站下载jdk-8u221-windows-x64.rar

    8. **并发改进**:包括Fork/Join框架的改进,以及对CountDownLatch、CyclicBarrier等并发工具的优化。 在安装JDK 8u221之前,确保你的系统满足以下条件: - 操作系统:Windows 64位(x64) - 硬盘空间:至少需要几...

    jdk-7u17-windows-x64.zip

    6. **并发改进**:对java.util.concurrent包进行了优化,包括改进的并发工具类,如CountDownLatch和CyclicBarrier,以及更高效的并发数据结构。 7. **编码改进**:增加了对编码格式的支持,比如对汉字和其他多字节...

    jdk-7u80-windows-x64.rar

    7. **改进的并发工具**:如Fork/Join框架,用于并行计算,以及新的CountDownLatch和CyclicBarrier。 8. **动态语言支持**:JSR 292(invokedynamic指令)增强了对动态语言的支持。 在这个压缩包中,我们有两个文件...

    jdk1.8系列——8u311-windows-x64.zip

    7. **改进的并发库**:JDK 1.8对并发库进行了增强,包括Fork/Join框架、CountDownLatch、CyclicBarrier等并发工具类的改进,使得多线程编程更加高效。 8. **Java虚拟机(JVM)优化**:JDK 1.8u311包含了针对JVM的...

    jdk-8u221-windows-x64.rar

    以及CountDownLatch、CyclicBarrier和Semaphore等并发工具类的增强。 在安装"jdk-8u221-windows-x64.exe"时,通常会进行以下步骤: 1. 下载并解压缩rar文件,得到exe安装程序。 2. 双击exe文件启动安装向导,按照...

    jdk-8u281-windows-x64.zip

    10. ** 并发改进**:包括Fork/Join框架、并发集合的优化以及新的CountDownLatch和CyclicBarrier等同步工具类,提高了多线程编程的效率和可维护性。 综上所述,JDK 8为Java开发者带来了丰富的功能和改进,它在保持向...

Global site tag (gtag.js) - Google Analytics