关于CountDownLatch的一个问题

light_sky light_sky 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
不知道为什么下面的代码没有执行循环,只执行了一次?请大侠帮忙解答,十分感谢


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();
}
}

}
...全文

相关推荐

评论 7
收藏 已收藏
分享
返回顶部
light_sky
Java SE 62,620 成员 307,251 内容