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

CountDownLatch的用法/等待多线程执行结果

阅读更多

在前面一篇博文http://guoba6688-sina-com.iteye.com/blog/724536中提出如何更方便的等待多线程执行结果,该篇博文的做法是

//等待线程执行完毕   
        while(threadPool.getActiveCount() > 0){   
            try{   
                Thread.sleep(1000);   
            }catch(Exception e){   
                e.printStackTrace();   
            }   
        }   

 

今天发现java类库中的CountDownLatch可以很方便的完成这个工作

 

CountDownLatch的原理时

1、先设一个线程数,通过构造函数。

2、启动线程后,调用await()方法等待内部保持的线程数归零

3、每个线程在完成后调用countDown(),将活动的线程数减1

4、当活动线程数归零后,执行下面的代码

 

 

附上代码

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

/**
 * 
 * CountDownLatch  的用法
 *
 * @author 锅巴
 * @version 1.0 2010-8-9
 */
public class Main {

    private ExecutorService pool;
    private int threadCount = 10;
    private CountDownLatch countDownLatch;
    
    public static void main(String[] args) throws InterruptedException {
        
        Main main = new Main();
        main.execute();
       
        System.out.println("Main is end ");
        
//        System.exit(0);
    }
    
    public Main(){
        threadCount = 10;
        pool = Executors.newFixedThreadPool(threadCount);
        //初始化线程数
        countDownLatch = new CountDownLatch(threadCount);
    }
    
    public void execute() throws InterruptedException{
        for(int i=0; i<threadCount; i++){
            pool.execute(new Handler(10,countDownLatch));
        }
        pool.shutdown();
        //等待线程执行完成
        //实现上是等待count变成0
        countDownLatch.await();
       
    }
    
    
    class Handler implements Runnable {
       
        private int count;
        
        private CountDownLatch countDownLatch;

        public Handler(int count,CountDownLatch countDownLatch) {
            this.count = count;
            this.countDownLatch = countDownLatch;
        }

        public void run() {
            // read and service request
            for(int i=0; i<count; i++){
                System.out.println(Thread.currentThread().getName() + " : " + i);
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            //当本线程完成就减1
            countDownLatch.countDown();
        }
    }
}

 

0
0
分享到:
评论
1 楼 mercyblitz 2010-08-09  
CountDownLatch并不是用户等待线程执行结束的,它是控制一定数量的线程执行。

要想得到结果,当线程运行完毕,要利用Future,或者ExecutorCompletionService。

相关推荐

    多线程并行执行,汇总结果

    这时,可以设置一个`CountDownLatch`,初始化计数值为线程的数量,每个线程执行完后调用`countDown()`,最后主线程通过调用`await()`方法等待计数值变为0,即所有线程执行完毕,然后进行结果的汇总。 **汇总结果** ...

    多线程countDownLatch方法介绍

    在Java多线程编程中,CountDownLatch是一个非常重要的同步工具类,它可以帮助我们协调多个线程之间的交互。本文将深入探讨CountDownLatch的工作原理、使用场景以及相关源码分析。 CountDownLatch是一个计数器,初始...

    java使用CountDownLatch等待多线程全部执行完成

    Java 使用 CountDownLatch 等待多线程全部执行完成 CountDownLatch 是 Java 中的一个同步工具类,允许一个或多个线程等待其他线程完成操作。它的应用场景非常广泛,例如在处理大量数据时,可以使用多线程的方式处理...

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

    在批量插入数据的场景下,可以创建一个CountDownLatch对象,初始化为线程的数量,每个线程处理完自己的数据后调用`countDown()`方法,主线程通过调用`await()`方法等待所有线程完成后再执行后续操作,如提交事务。...

    Java多线程--等待所有子线程执行完的五种方法.docx

    在Java多线程编程中,有时我们需要确保所有子线程执行完毕后再进行后续操作,例如在并发测试、数据聚合或资源清理等场景。本篇文章将详细介绍五种在Java中等待所有子线程执行完的方法。 ### 方法一:使用`sleep`...

    多线程demo/java多线程练习

    - **CountDownLatch**:常用于多线程间的同步,计数器从正整数开始,每当一个线程完成任务,计数器减一,当计数器为零时,所有等待的线程将被释放。 - **CyclicBarrier**:允许一组线程等待彼此到达某个屏障点,...

    利用 CountDownLatch 类实现线程同步

    2. **并发测试**:在测试中,可以创建多个线程模拟并发执行,然后使用 `CountDownLatch` 让测试代码等待所有并发操作完成,确保测试结果的正确性。 3. **框架设计**:在自定义框架或库中,如果有多个组件或服务需要...

    多线程执行完后主程序再执行(包括需要子线程返回结果)

    标题提到的“多线程执行完后主程序再执行(包括需要子线程返回结果)”是一个典型的多线程同步问题。在这个场景中,主程序会启动多个子线程去执行不同的任务,然后等待所有子线程执行完毕,最后处理子线程返回的结果...

    java多线程之A线程等B、C线程都执行完在执行的结果示例

    在这个场景中,我们关注的是一个特定的多线程问题:A线程需要等待B线程和C线程执行完毕后再开始执行,同时避免A线程无休止地检查状态导致的CPU空耗。 首先,我们需要理解Java中线程间的协作机制。Java提供了多种...

    多线程计数实现多线程执行后再执行主线程

    通过以上分析,我们可以看到使用`CountDownLatch`来协调多线程执行顺序是一种非常有效的方式。这种方式不仅能够简化程序设计,还能够提高系统的稳定性和健壮性。在实际项目开发中,合理地利用这种技术可以有效地解决...

    CountDownLatch学习用法

    CountDownLatch是Java并发...在上述的`CountDownLatchDemo`中,可能包含了创建多个线程,每个线程执行一部分任务,然后调用`countDown()`,最后主线程调用`await()`等待所有任务完成,展示了CountDownLatch的基本用法。

    Java主线程等待子线程执行完毕

    Java 主线程等待子线程执行完毕 Java 中的多线程编程是非常重要的一部分,特别是在需要并发执行多个任务的情况下。然而,在某些情况下,我们需要等待所有子线程执行完毕后再继续执行主线程的剩余动作。这时,我们...

    计算多线程环境下执行任务时间1

    在多线程编程中,准确地测量任务执行时间是一项挑战,因为并发执行使得任务的启动和结束时间难以确定。Java的`java.util.concurrent`包...通过合理地使用`CountDownLatch`,我们可以编写更加灵活和可控的多线程程序。

    JAVA多线程的实例

    Java并发包`java.util.concurrent`提供了高级并发工具,如`Semaphore`(信号量)、`CyclicBarrier`(回环栅栏)、`CountDownLatch`(计数器门闩)等,它们可以更灵活地控制线程执行。例如,`CountDownLatch`常用于...

    java并发(二十四)多线程结果组装

    可以使用`CompletableFuture`类来实现更复杂的异步操作和结果合并,例如使用`allOf()`方法等待所有任务完成,然后通过`thenApply()`或`thenCombine()`收集和处理结果。 6. **并发工具类**:Java并发包提供了许多...

    JAVA多线程CountDownLatch使用详解

    JAVA多线程CountDownLatch是JAVA多线程编程中的一种同步工具,主要用来让某个线程等待其他线程执行完毕后再继续执行。下面我们将详细介绍JAVA多线程CountDownLatch的使用和原理。 什么时候用CountDownLatch? 在多...

    多线程的实验

    "多线程.pdf"很可能包含更详细的理论解释和案例分析,可能涵盖了线程优先级、线程生命周期(新建、就绪、运行、阻塞、死亡)、线程安全的数据结构(如ConcurrentHashMap)以及高级特性如线程局部变量(ThreadLocal)...

    CountDownLatch和CyclicBarrier用法实例大全

    - 使用CountDownLatch实现多线程并行计算,最后汇总结果的例子。 - 使用CyclicBarrier实现多线程分治策略,每个子任务完成后来一次全局计算的例子。 - 线程间的异常处理,包括中断和超时的处理。 - 结合Future和...

    CountDownLatch练习

    2. **并发执行**: 在多线程环境中,每个线程执行完毕后调用`countDown()`,这会将计数器减一。 3. **等待同步**: 主线程或其他线程调用`await()`方法,这会使当前线程等待,直到计数器变为零才继续执行。 4. **...

    Java多线程--让主线程等待所有子线程执行完毕

    尝试在每个子线程的开始使用`t.join()`方法,虽然可以强制主线程等待子线程的完成,但这会导致线程顺序执行,失去并行处理的优势,违背了使用多线程的目的。 **3. 自定义线程类实现并发控制** 为了解决上述问题,...

Global site tag (gtag.js) - Google Analytics