`

CountDownLatch的使用实例

阅读更多

CountDownLatch

 

CountDownlatch,是一种Sychronizer,它可以延迟线程的进度直到线程的进度到线程到达终止状态。

 

它本身而言是Java并发包中非常有用的一个类,它可以让某些任务完成以后再继续运行下面的内容,每个任务本身执行完毕后让计数器减一,直到计数器清零后,以下的内容才可以继续运行,否则将阻塞等待。

 

想了一下,这个场景非常适合用于项目中这样的场景: 我们有个项目,它需要三个第三方的API,并把结果拿到,在一个线程中顺序去拿结果没有问题,但是这里这三个任务是非常耗时的操作,如果顺序获取性能非常差,因此可以考虑用三个线程,当三个线程拿到结果后才继续主线程的工作,等三个线程运行结束后,由主线程去取子线程运行的结果。 这里有个很重要的前提:我们的系统运行在4个cpu的server上,这样多线程才能体现性能,JVM会分配这些线程尽量运行在不同的cpu上。

 

CountDownLatch有以下基本方法:

1)await(),阻塞等待,直到计数器清零

 

2)await(int timeout, TimeUnit unit),使线程阻塞,除非被中断或者超过等待的最大时间

如果达到计数器清零,则await返回true,如果等待超过了最大的等待时间,则返回false

 

3)countDown(),计数器减一,当计数器清零时,await的线程被唤醒,线程继续执行

 

4)getCount (),获取当前计数器的大小

 

 

package countdownlatch;

import java.util.concurrent.CountDownLatch;

/**
 *
 *<p>Test</p>
 *<p>Description:</P>
 *<p>Company:</p>
 *<p>Department:CAS</p>
 *@Author: Tommy Zhou
 *@Since: 1.0
 *@Version:Date:2011-4-26
 *
 **/

public class CountDownLatchSample {
   
    public static void main(String[] args) {
        String[] strs = getResult();
        for (int i = 0; i < strs.length; i++) {
            System.out.println(strs[i]);
        }
       
    }
   
    public static String[] getResult(){
        String[] strs = new String[3];
        CountDownLatch countDownLatch = new CountDownLatch(3);
        Work1 work1 = new Work1(countDownLatch,strs[0]);
        Work2 work2 = new Work2(countDownLatch,strs[1]);
        Work3 work3 = new Work3(countDownLatch,strs[2]);
        work1.start();
        work2.start();
        work3.start();
        try {
            countDownLatch.await();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        strs[0] = work1.str1;
        strs[1] = work2.str2;
        strs[2] = work3.str3;
        return strs;
    }
}

class Work1 extends Thread{
    public String str1;
    public CountDownLatch latch1;
    public Work1(CountDownLatch latch1,String str1){
        this.latch1 = latch1;
        this.str1 = str1;
    }
   
   
    public void run(){
        str1="work1";
        latch1.countDown();
    }
}

class Work2 extends Thread{
    public String str2;
    public CountDownLatch latch2;
    public Work2(CountDownLatch latch2,String str2){
        this.latch2 = latch2;
        this.str2 = str2;
    }
   
   
    public void run(){
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        str2="work2";
        latch2.countDown();
    }
}

class Work3 extends Thread{
    public String str3;
    public CountDownLatch latch3;
    public Work3(CountDownLatch latch3,String str3){
        this.latch3 = latch3;
        this.str3 = str3;
    }
   
   
    public void run(){
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        str3="work3";
        latch3.countDown();
    }
}

分享到:
评论

相关推荐

    CountDownLatch和CyclicBarrier用法实例大全

    4. **一次性使用**: 一旦计数器归0,`await()`将不再阻塞任何线程,且CountDownLatch不能重置,只能一次性使用。 **CyclicBarrier** CyclicBarrier则更像一个障碍,它允许一组线程彼此等待,直到所有的线程都到达...

    CountDownLanch.rar

    - 其他 N 个线程必须引用闭锁对象,因为它们如果完成了任务需要通过 CountDownLatch.countDown() 方法来通知CountDownLatch实例,每次调用计数减少 1。当所有 N 个线程都调用了这个方法时,计数将达到 0,主线程...

    多线程countDownLatch方法介绍

    1. 初始化:通过`CountDownLatch(int count)`构造方法创建一个CountDownLatch实例,其中count参数表示计数器的初始值。 ```java CountDownLatch latch = new CountDownLatch(3); // 设置为3,表示有3个子任务 ``` 2....

    Java中CountDownLatch进行多线程同步详解及实例代码

    Java中CountDownLatch进行多线程同步详解及实例代码 CountDownLatch是Java中的一种多线程同步辅助类,主要用来同步多个任务的执行。它允许一个或多个线程等待,直到一组正在其他线程中执行的操作完成。下面是对...

    mybaits 多线程 实现数据批量插入 (运用CountDownLatch实现闭锁)

    1. 创建一个CountDownLatch实例,初始化为线程数量。 2. 将数据分为多个批次,每个批次分配给一个线程处理。 3. 每个线程在开始执行前调用`latch.countDown()`,表示它已经准备好开始工作。 4. 线程执行数据插入操作...

    Java多线程编程之CountDownLatch同步工具使用实例

    程序创建了一个ExecutorService来管理线程池,然后创建了两个CountDownLatch实例:`cdOrder`和`cdAnswer`。`cdOrder`表示裁判发布的命令,计数器为1,意味着所有运动员必须等待裁判的命令才能开始。`cdAnswer`表示...

    countdownlatch-example-sourcecode.zip

    - 在主程序中创建CountDownLatch实例并初始化,如`CountDownLatch latch = new CountDownLatch(n)`,其中n表示需要完成的任务数量。 - 启动n个线程执行各自的任务,每个任务完成后调用`countDown()`方法。 - 主线...

    Java CountDownLatch完成异步回调实例详解

    在本文中,我们将学习如何使用 CountDownLatch 来完成异步回调实例,并探讨相关的知识点。 CountDownLatch 的工作原理 CountDownLatch 的工作原理基于计数器的概念。它维护一个计数器,初始值是指定的整数。每当一...

    CountDownLatch详解.docx

    在提供的示例代码中,我们创建了一个 CountDownLatch 实例,初始值为3,表示有3个工作线程需要完成任务。然后创建了2个等待线程,它们会在调用 `await()` 后进入等待状态。接着启动所有线程,工作线程在运行后调用 ...

    java并发编程专题(八)----(JUC)实例讲解CountDownLatch

    下面是一个使用CountDownLatch的实例,模拟了运动员比赛的场景: public class TestCountDownLatch { private static final int RUNNER_NUMBER = 5; // 运动员个数 private static final Random RANDOM = new ...

    Java中CountDownLatch用法解析

    在`CountDownLatch`实例化时,计数器设置为这个初始值。每当调用`countDown()`方法时,计数器就会减1。当计数器的值为0时,任何因调用`await()`而阻塞的线程都将被释放并继续执行。这使得`CountDownLatch`成为一个...

    java线程并发countdownlatch类使用示例

    在`startServer()`方法中,首先打印出"Server is starting.",然后创建了一个`CountDownLatch`实例,其门限值设置为3,表示有3个组件需要初始化。接着,使用`ExecutorService`创建了一个线程池,并提交了3个`...

    java高级编程100实例

    10. **并发工具**:如CountDownLatch、CyclicBarrier、Semaphore等,这些工具可以帮助构建复杂的并发程序,实例可能展示如何有效使用它们。 11. **Java 8及以后的新特性**:如Lambda表达式、Stream API、Optional类...

    CountDownLatch 和 CyclicBarrier 的运用(含AQS详解)

    1. **初始化:** 使用给定的计数值创建一个 CountDownLatch 实例。 2. **递减计数器:** 在需要完成的工作完成后,调用 `countDown()` 方法来递减计数器。 3. **等待:** 其他线程调用 `await()` 方法来等待计数器的...

    140个Java源码实例

    15. **并发编程**:Java提供了丰富的并发工具类,如CountDownLatch、CyclicBarrier、Semaphore等,实例将展示如何高效地管理并发任务。 通过逐一研究这些源码实例,不仅可以加深对Java语言的理解,还能提升实际编程...

    27 倒数计时开始,三、二、一—CountDownLatch详解.pdf

    使用 CountDownLatch 需要创建一个实例并传入一个初始计数值,这个计数值表示需要等待的线程数量。然后,每个需要等待的线程在完成任务后调用 `countDown()` 方法,将计数值减一。主线程或其他需要等待的线程调用 `...

    JAVA CountDownLatch(倒计时计数器)用法实例

    本文将详细介绍 CountDownLatch 的用法实例,通过示例代码来讲解其使用方法。 CountDownLatch 的主要方法 CountDownLatch 有两个主要方法:countDown() 和 await()。 1. countDown() 方法: public void ...

    Java高级编程实例 100个

    10. **并发工具类**:如Semaphore(信号量)、CountDownLatch(倒计时锁)、CyclicBarrier(回环栅栏)等,用于控制并发访问和同步。 通过这100个实例,初学者不仅能掌握Java高级特性,还能提升问题解决能力和实际...

    JAVA实例精通源代码

    6. **多线程**:Java提供了丰富的多线程支持,源码中会包含Thread、Runnable接口的使用,以及同步机制如synchronized关键字、wait/notify机制和并发工具类(如Semaphore、CountDownLatch等)的实例。 7. **网络编程...

    Java JDK 实例宝典 源代码

    10. **并发库**:Java提供了丰富的并发工具类,如ExecutorService、Semaphore、CountDownLatch等,实例会展示如何高效地管理线程池和控制并发。 11. **Java IO/NIO**:NIO(New Input/Output)是Java的非阻塞I/O...

Global site tag (gtag.js) - Google Analytics