关于CountDownLatch的一个问题
不知道为什么下面的代码没有执行循环,只执行了一次?请大侠帮忙解答,十分感谢
import java.util.concurrent.CountDownLatch;
class Driver{
public static void main(String[] args) {
CountDownLatch startSignal = new CountDownLatch(1);//启动信号
CountDownLatch doneSignal = new CountDownLatch(3);//记录3个工人的状态
try {
for(int i=0;i<3;i++){
System.out.println("************"+i);
//调用3个工人工作,虽然调用了start方法,但是worker的内部
//使用了CountDownLatch.await(),所以需要countDown(),才能工作
new Thread(new Worker(startSignal,doneSignal)).start();
System.out.println("经理即将发布任务");
startSignal.countDown();//让所有的工人开始工作
System.out.println("经理已发布任务,等待员工提交……");
doneSignal.await();//等待所有的工人都完成
System.out.println("所有工作完成");
}
}catch(Exception e){
e.printStackTrace();
}
}
}
class Worker implements Runnable{
CountDownLatch startSignal;
CountDownLatch doneSignal;
Worker(CountDownLatch startSignal,CountDownLatch doneSignal){
this.startSignal = startSignal;
this.doneSignal = doneSignal;
}
void doWork(){
System.out.println("线程" +Thread.currentThread().getName()+"已接收命令,开始执行!");
};
@Override
public void run() {
try {
System.out.println("线程"+Thread.currentThread().getName()+"已准备完毕");
startSignal.await();//工人处于就绪状态
doWork();
doneSignal.countDown();//每个工人做完自己的工作,就去提交
System.out.println("线程"+Thread.currentThread().getName()+"完成任务,已提交");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
...全文
相关推荐
framework-analysis:对使用Hibernate出现的问题进行分析;Spring、MyBatis、AQS、ThreadPoolExecutor、CountDownLatch核心源码分析
read一开始这个项目的目的是对Hibernate、MyBatis出现的问题进行归纳,但是我在总结问题的时候,陆陆续续发现了自己的不足。于是乎到现在的Hibernate、MyBatis、Spring、
Java CountDownLatch完成异步回调实例详解
* 它提供了一个简单的方式来同步线程,避免了繁琐的线程同步代码。* 它能够确保所有线程完成任务后,才执行回调操作,避免了数据不一致的问题。
CountDownLatch同步工具类使用详解
CountDownLatch的用法非常简单,它可以用来控制线程的执行顺序,使得某些线程能够等待其他线程执行完成后再执行。使用CountDownLatch可以解决以下问题:1.
CountDownLatch 和 CyclicBarrier 的运用(含AQS详解)
,它主要用于解决“一个或多个线程等待其他线程完成任务”的问题。
CountDownLatch练习
在实际编程中,熟练掌握CountDownLatch可以帮助我们更有效地编写高并发程序,解决复杂的同步问题。


Java SE
