package com.coship.locktest;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
public class CountDownLatchTest {
/**
* @param args
*/
public static void main(String[] args) {
/*
* try { new CountDownLatchTest.Driver().main(); } catch
* (InterruptedException e) { // TODO Auto-generated catch block
* e.printStackTrace(); }
*/
try {
new CountDownLatchTest.Driver2().main();
} catch (InterruptedException e) { // TODO Auto-generated catch block
e.printStackTrace();
}
}
private static class Driver { // ...
void main() throws InterruptedException {
CountDownLatch startSignal = new CountDownLatch(1);
CountDownLatch doneSignal = new CountDownLatch(5);
for (int i = 0; i < 5; ++i)
// create and start threads
new Thread(new Worker(startSignal, doneSignal)).start();
//执行dowork()方法前处理
doSomethingElse(); // don't let run yet
//执行此方法后,dowork()执行
startSignal.countDown(); // let all threads proceed
doSomethingElse1();
doneSignal.await(); // wait for all to finish
}
private void doSomethingElse() {
System.out.println("do doSomethingElse...");
}
private void doSomethingElse1() {
System.out.println("do doSomethingElse1...");
}
}
static class Worker implements Runnable {
private final CountDownLatch startSignal;
private final CountDownLatch doneSignal;
Worker(CountDownLatch startSignal, CountDownLatch doneSignal) {
this.startSignal = startSignal;
this.doneSignal = doneSignal;
}
public void run() {
try {
//所有线程等待
startSignal.await();
doWork();
doneSignal.countDown();
} catch (InterruptedException ex) {
} // return;
}
void doWork() {
System.out.println("do work...");
}
}
static class Driver2 { // ...
void main() throws InterruptedException {
CountDownLatch doneSignal = new CountDownLatch(5);
Executor e = Executors.newCachedThreadPool();
for (int i = 0; i < 5; ++i) // create and start threads
e.execute(new WorkerRunnable(doneSignal, i));
doneSignal.await(); // wait for all to finish
System.out.println("all finished");
}
}
static class WorkerRunnable implements Runnable {
private final CountDownLatch doneSignal;
private final int i;
WorkerRunnable(CountDownLatch doneSignal, int i) {
this.doneSignal = doneSignal;
this.i = i;
}
public void run() {
doWork(i);
doneSignal.countDown();
}
void doWork(int i) {
System.out.println("do working" + i);
}
}
}
分享到:
相关推荐
1. 测试框架:在并发测试中,CountDownLatch可以用来确保所有测试线程都完成了其测试操作,然后统一收集结果或进行清理工作。 2. 数据库连接池:数据库连接池在初始化时可能需要创建多个连接,完成后才允许客户端...
2. **并发测试**:在测试中,可以创建多个线程模拟并发执行,然后使用 `CountDownLatch` 让测试代码等待所有并发操作完成,确保测试结果的正确性。 3. **框架设计**:在自定义框架或库中,如果有多个组件或服务需要...
- **测试框架**: 测试类可能需要等待所有测试线程完成后再进行结果汇总。 - **数据加载**: 在所有数据加载线程完成加载后,应用程序可以开始提供服务。 - **并发竞赛条件**: 控制并发线程的数量,防止过多线程同时...
通常,测试代码会创建一个 CountDownLatch 对象,然后在线程中执行任务并调用 `countDown()`,最后在主线程中调用 `await()` 等待所有线程执行完毕。通过阅读和分析这个示例,我们可以更好地理解 CountDownLatch 的...
- 测试框架:在测试中,启动多个测试线程,确保所有测试执行完毕后再进行结果汇总。 - 数据库连接池:初始化时,等待所有数据库连接准备好后再提供服务。 6. **源码解析** CountDownLatch的实现基于`java.util....
总的来说,CountDownLatch 是一个强大的同步工具,适用于需要等待一组线程完成后再继续执行的情况,如初始化服务、测试框架中的多线程同步等。正确使用 CountDownLatch 可以提高程序的并发性能,避免不必要的等待,...
并发编程是多线程环境下确保程序正确执行的...而CountDownLatch则用于线程间的协调,让一个线程等待其他线程完成任务,常用于启动框架服务、多线程测试等场景。熟练掌握这两种工具,能有效提升并发程序的效率和正确性。
这在多线程并发编程中非常有用,例如在测试中启动多个测试线程,然后等待所有测试完成后再汇总结果。 总结起来,CountDownLatch 是一个基于计数器的同步工具,它的核心在于与 AQS 的交互,通过计数器的递减和等待...
3. **多线程**:了解线程的概念,掌握Thread类和Runnable接口,知道同步机制(synchronized关键字,wait/notify机制,Lock接口等)以及并发工具类如ExecutorService、Semaphore、CountDownLatch等。 4. **Java测试...
8. **异步测试**:由于许多Android操作是异步的,因此需要处理异步回调,如使用`UiThreadTestRule`或`CountDownLatch`来确保测试顺序正确。 9. **模拟数据**:在测试中,使用Mock对象或者创建测试数据集来代替真实...
1. 主线程等待子线程完成任务,例如在多线程测试中,主线程等待所有测试线程执行完毕再打印测试结果。 2. 多个组件初始化完成后,主线程再继续执行,确保系统的所有部分都已准备就绪。 3. 控制并发任务的并发度,...
CountDownLatch的一个常见应用场景是在测试中,比如在测试一个系统组件之前,可能需要启动多个依赖服务,确保它们都在运行后再开始测试。另一个应用是在分布式计算中,当需要等待所有参与计算的节点完成任务后,才能...
在实际应用中,`CountDownLatch`常用于分布式系统、多线程协作、测试场景等,例如等待所有客户端连接完成、确保所有数据加载完毕后再开始服务等。 总结一下`CountDownLatch`的主要知识点: 1. `CountDownLatch`是...
5. **多线程**:学习Thread类和Runnable接口,同步机制(如synchronized关键字、wait()、notify()和notifyAll()方法),以及并发工具类如Semaphore、CountDownLatch等。 6. **集合框架**:熟悉ArrayList、...
`java.util.concurrent`包提供了许多并发工具,如CountDownLatch(计数器,用于同步多个线程),CyclicBarrier(屏障,等待所有线程到达指定点后继续执行),Semaphore(信号量,控制并发访问数量)等。 6. **死锁...
4. **多线程**:线程同步机制(synchronized、Lock)、并发工具类(如Semaphore、CountDownLatch)。 5. **IO/NIO**:输入输出流的处理,NIO(New IO)的非阻塞特性。 6. **设计模式**:了解并能应用常见的设计模式...
Java提供了一系列的并发工具,如线程(Thread)、ExecutorService、Semaphore、CyclicBarrier、CountDownLatch等,这些工具可以帮助开发者创建和管理线程,以及协调线程间的协作。`MutiThreadTest.java` 可能会使用...
- **测试框架**: 在测试类中,可以使用`CountDownLatch`确保测试方法在所有预设条件满足后才执行。 - **并发任务**: 当需要执行一系列并发任务,且必须在所有任务完成后进行汇总处理时,`CountDownLatch`也是很好...
JDK的`java.util.concurrent`包提供了多线程和并发工具,如`ExecutorService`和`CountDownLatch`,可以帮助开发者模拟并测试多线程场景,评估系统的并发性能。`java.lang.management`包则提供了监控和管理Java应用...
CountDownLatch的一个典型应用场景是启动多个并发任务,然后等待所有任务完成后再进行下一步操作,例如并发测试、多线程初始化等。在并发编程中,CountDownLatch能够有效地协调线程间的交互,避免主线程过早结束或者...