在前面一篇博文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();
}
}
}
分享到:
相关推荐
这时,可以设置一个`CountDownLatch`,初始化计数值为线程的数量,每个线程执行完后调用`countDown()`,最后主线程通过调用`await()`方法等待计数值变为0,即所有线程执行完毕,然后进行结果的汇总。 **汇总结果** ...
在Java多线程编程中,CountDownLatch是一个非常重要的同步工具类,它可以帮助我们协调多个线程之间的交互。本文将深入探讨CountDownLatch的工作原理、使用场景以及相关源码分析。 CountDownLatch是一个计数器,初始...
Java 使用 CountDownLatch 等待多线程全部执行完成 CountDownLatch 是 Java 中的一个同步工具类,允许一个或多个线程等待其他线程完成操作。它的应用场景非常广泛,例如在处理大量数据时,可以使用多线程的方式处理...
在批量插入数据的场景下,可以创建一个CountDownLatch对象,初始化为线程的数量,每个线程处理完自己的数据后调用`countDown()`方法,主线程通过调用`await()`方法等待所有线程完成后再执行后续操作,如提交事务。...
在Java多线程编程中,有时我们需要确保所有子线程执行完毕后再进行后续操作,例如在并发测试、数据聚合或资源清理等场景。本篇文章将详细介绍五种在Java中等待所有子线程执行完的方法。 ### 方法一:使用`sleep`...
- **CountDownLatch**:常用于多线程间的同步,计数器从正整数开始,每当一个线程完成任务,计数器减一,当计数器为零时,所有等待的线程将被释放。 - **CyclicBarrier**:允许一组线程等待彼此到达某个屏障点,...
2. **并发测试**:在测试中,可以创建多个线程模拟并发执行,然后使用 `CountDownLatch` 让测试代码等待所有并发操作完成,确保测试结果的正确性。 3. **框架设计**:在自定义框架或库中,如果有多个组件或服务需要...
标题提到的“多线程执行完后主程序再执行(包括需要子线程返回结果)”是一个典型的多线程同步问题。在这个场景中,主程序会启动多个子线程去执行不同的任务,然后等待所有子线程执行完毕,最后处理子线程返回的结果...
在这个场景中,我们关注的是一个特定的多线程问题:A线程需要等待B线程和C线程执行完毕后再开始执行,同时避免A线程无休止地检查状态导致的CPU空耗。 首先,我们需要理解Java中线程间的协作机制。Java提供了多种...
通过以上分析,我们可以看到使用`CountDownLatch`来协调多线程执行顺序是一种非常有效的方式。这种方式不仅能够简化程序设计,还能够提高系统的稳定性和健壮性。在实际项目开发中,合理地利用这种技术可以有效地解决...
CountDownLatch是Java并发...在上述的`CountDownLatchDemo`中,可能包含了创建多个线程,每个线程执行一部分任务,然后调用`countDown()`,最后主线程调用`await()`等待所有任务完成,展示了CountDownLatch的基本用法。
Java 主线程等待子线程执行完毕 Java 中的多线程编程是非常重要的一部分,特别是在需要并发执行多个任务的情况下。然而,在某些情况下,我们需要等待所有子线程执行完毕后再继续执行主线程的剩余动作。这时,我们...
在多线程编程中,准确地测量任务执行时间是一项挑战,因为并发执行使得任务的启动和结束时间难以确定。Java的`java.util.concurrent`包...通过合理地使用`CountDownLatch`,我们可以编写更加灵活和可控的多线程程序。
Java并发包`java.util.concurrent`提供了高级并发工具,如`Semaphore`(信号量)、`CyclicBarrier`(回环栅栏)、`CountDownLatch`(计数器门闩)等,它们可以更灵活地控制线程执行。例如,`CountDownLatch`常用于...
可以使用`CompletableFuture`类来实现更复杂的异步操作和结果合并,例如使用`allOf()`方法等待所有任务完成,然后通过`thenApply()`或`thenCombine()`收集和处理结果。 6. **并发工具类**:Java并发包提供了许多...
JAVA多线程CountDownLatch是JAVA多线程编程中的一种同步工具,主要用来让某个线程等待其他线程执行完毕后再继续执行。下面我们将详细介绍JAVA多线程CountDownLatch的使用和原理。 什么时候用CountDownLatch? 在多...
"多线程.pdf"很可能包含更详细的理论解释和案例分析,可能涵盖了线程优先级、线程生命周期(新建、就绪、运行、阻塞、死亡)、线程安全的数据结构(如ConcurrentHashMap)以及高级特性如线程局部变量(ThreadLocal)...
- 使用CountDownLatch实现多线程并行计算,最后汇总结果的例子。 - 使用CyclicBarrier实现多线程分治策略,每个子任务完成后来一次全局计算的例子。 - 线程间的异常处理,包括中断和超时的处理。 - 结合Future和...
2. **并发执行**: 在多线程环境中,每个线程执行完毕后调用`countDown()`,这会将计数器减一。 3. **等待同步**: 主线程或其他线程调用`await()`方法,这会使当前线程等待,直到计数器变为零才继续执行。 4. **...
尝试在每个子线程的开始使用`t.join()`方法,虽然可以强制主线程等待子线程的完成,但这会导致线程顺序执行,失去并行处理的优势,违背了使用多线程的目的。 **3. 自定义线程类实现并发控制** 为了解决上述问题,...