import java.util.concurrent.CountDownLatch;
/**
* 这个适用于等待N个线程执行完任务,再执行另外的线程的任务。
* @author Administrator
*
*/
public class Driver {
private int N = 5;
void test() throws InterruptedException {
CountDownLatch startSignal = new CountDownLatch(1);
CountDownLatch doneSignal = new CountDownLatch(N);//make sure the "N" equal the number of threads
for (int i = 0; i < N; ++i) // create and start threads
new Thread(new Worker(startSignal, doneSignal)).start();
long start = System.nanoTime();// don't let run yet
startSignal.countDown(); // let all threads proce
System.out.println(startSignal.getCount());
doneSignal.await(); // make the main thread wait for all to finish
long end = System.nanoTime();
System.out.println("time = " + (end -start)+"ns "+Thread.currentThread().getName());//所有等待的线程执行完了,才会执行这行语句。
}
public static void main(String ...args){
Driver dr = new Driver();
try{
dr.test();
}catch (Exception e) {
e.printStackTrace();
}
}
}
class Worker implements Runnable {
private final CountDownLatch startSignal;//startSignal被多个线程共用
private final CountDownLatch doneSignal;//doneSignal被多个线程共用
Worker(CountDownLatch startSignal, CountDownLatch doneSignal) {
this.startSignal = startSignal;
this.doneSignal = doneSignal;
}
public void run() {
try {
startSignal.await();//使当前线程在锁存器倒计数至零之前一直等待,除非线程被中断。
doWork();
doneSignal.countDown();//递减锁存器的计数,如果计数到达零,则释放所有等待的线程,执行一次计数器减去1,不会自动减到0
} catch (InterruptedException ex) {} // return;
}
void doWork() {
System.out.println("working..."+Thread.currentThread().getName());
}
}
分享到:
相关推荐
4. **CountDownLatch示例** 压缩包中的`countdownlatch`文件可能包含了一个或多个人工创建的示例,展示了如何在实际项目中使用CountDownLatch。例如,模拟一个团队赛跑场景,所有队员出发后,裁判(主线程)等待...
下面是一个简单的CountDownLatch示例: ```java static CountDownLatch c = new CountDownLatch(2); public static void main(String[] args) throws InterruptedException { new Thread(new Runnable() { @...
CountDownLatch是Java并发编程中一个重要的工具类,用于协调多线程间的同步。它由Java并发包`java.util.concurrent`提供,主要用于解决一种场景:在主控线程等待多个子线程完成各自任务后再继续执行的情况。下面我们...
java.并发工具类CountDownLatch(处理方案示例).md
在 `CountDownLatchDemo` 这个示例中,我们可能会看到以下代码结构: ```java CountDownLatch latch = new CountDownLatch(3); // 初始化计数器为3,代表3个线程 // 创建3个线程执行任务 new Thread(() -> { // ...
下面是一个使用 CountDownLatch 实现主线程和子线程通信的示例代码: ```java public class CountDownLatchTest { public static void main(String[] args) { final CountDownLatch cdOrder = new CountDownLatch...
并发编程的一些小示例 1.等待通知的几种方式,包括Object的wait/notify,Condition的await/signal 2. CountDownLatch,统一控制多线程开始和结束 3.原子操作,AtomicXXX 4.线程池
在示例代码中,`CountDownLatchTest`类展示了如何使用`CountDownLatch`。它创建了一个名为`ComponentThread`的线程类,这个类代表了需要初始化的组件。每个`ComponentThread`都有一个唯一的ID,并且在构造时传入了一...
在 "CurrentTest" 这个示例文件中,可能包含了如何创建和使用 CountDownLatch 的代码片段。通常,测试代码会创建一个 CountDownLatch 对象,然后在线程中执行任务并调用 `countDown()`,最后在主线程中调用 `await()...
开发中碰到的
在提供的示例代码中,我们创建了一个 CountDownLatch 实例,初始值为3,表示有3个工作线程需要完成任务。然后创建了2个等待线程,它们会在调用 `await()` 后进入等待状态。接着启动所有线程,工作线程在运行后调用 ...
Java并发编程之同步器代码示例 ...Java并发编程之同步器代码示例展示了Java中的同步器机制,包括CountDownLatch、Semaphore、Barrier和Exchanger队列同步器等,帮助开发者更好地理解和使用Java中的并发编程技术。
下面是一个使用CountDownLatch来同步10个参会者和一个主持人参加的一个会的示例代码: ```java public class VideoConference implements Runnable { private final CountDownLatch countDownLatch; private int ...
下面是一个模拟乘客登机的`CountDownLatch`使用示例: ```java public class CountDownLatchTest { public static void main(String[] args) throws InterruptedException { System.out.println("南京禄口机场_...
### CountDownLatch 和 CyclicBarrier 的运用(含AQS详解) #### CountDownLatch **定义与特点:** CountDownLatch 是 Java 并发包中的一个重要组件,它主要用于解决“一个或多个线程等待其他线程完成任务”的问题。...
在给出的代码示例中,`CountDownLatchDemo`类创建了两个`CountDownLatch`实例:`begin`和`end`。`begin`计数器的初始值为1,代表比赛开始的信号;`end`计数器的初始值为5,对应5位参赛运动员。在主方法中,首先创建...
CountDownLatch的使用示例: ```java public class Test { public static void main(String[] args) { CountDownLatch begin = new CountDownLatch(1); CountDownLatch end = new CountDownLatch(2); for(int ...
在我们的示例中,我们使用 CountDownLatch 来等待五个任务的完成。 首先,我们创建了一个 CountDownLatch 对象,并将其初始化为 5,这意味着我们需要等待五个任务的完成。然后,我们创建了五个任务,每个任务都是一...
例如,在上面的示例代码中,我们创建了 10 个线程,每个线程累加 10000 次,然后调用 countDown 方法,最后在主线程中调用 await 方法等待所有线程完成。 CountDownLatch 的 await 方法还支持超时时间的设置,当...
在示例代码中,SemaphoreSample展示了Semaphore的实际应用。创建一个拥有2个许可的Semaphore,然后启动5个线程。每个线程试图获取许可,执行任务(这里仅仅是打印时间和睡眠),然后释放许可。输出结果显示每次只有...