不知道为什么下面的代码没有执行循环,只执行了一次?请大侠帮忙解答,十分感谢
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();
}
}
}
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();
}
}
}
解决方案 »
- OAuth1.0a基于Java桌面应用程序
- 用Java处理bmp图片,把bmp图片变成位图,并保存下来。快疯了。。。。。。。
- StringBuffer和StringBuilder的区别?
- 对象序列化问题?怎么反序列化一组对象
- !!!<applet>中的jar怎么设???????!!!!!!!!!!!!!!!!!!
- select count(DISTINCT tr_code, tr_date) from serial_no为什么出错??
- 数据结构与算法讨论
- 局域网传输文件
- 求助:"错误:com/borland/jbcl/layout/XYLayout"应如何解决?
- 怎样用java编写一个宠物商店
- 远程发送给server多个class文件,server怎么执行这些class?
- java 方法返回值
你在循环外创建CountDownLatch,在循环内使用,肯定是不行的,创建语句也应该写到循环内
API示例class Driver { // ...
void main() throws InterruptedException {
CountDownLatch startSignal = new CountDownLatch(1);
CountDownLatch doneSignal = new CountDownLatch(N); for (int i = 0; i < N; ++i) // create and start threads
new Thread(new Worker(startSignal, doneSignal)).start(); doSomethingElse(); // don't let run yet
startSignal.countDown(); // let all threads proceed
doSomethingElse();
doneSignal.await(); // wait for all to finish
}
} 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() { ... }
}我自己的另一个代码,可以正常运行import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class CountDownLatchTest {
public static void main(String[] args) {
ExecutorService service = Executors.newCachedThreadPool();
final CountDownLatch startSignal = new CountDownLatch(1);
final CountDownLatch doneSignal = new CountDownLatch(3);
for(int i=0;i<3;i++){
Runnable runnable = new Runnable() {
@Override
public void run() {
try {
System.out.println("线程"+Thread.currentThread().getName()+"正在准备");
startSignal.await();
System.out.println("线程"+Thread.currentThread().getName()+"开始运行");
Thread.sleep((long) (Math.random() * 10000));
doneSignal.countDown();
System.out.println("线程"+Thread.currentThread().getName()+"已运行完");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
service.execute(runnable);
}
try {
Thread.sleep((long) (Math.random() * 10000));
System.out.println("线程"+Thread.currentThread().getName()+"即将发出任务");
startSignal.countDown();
System.out.println("线程"+Thread.currentThread().getName()+"已发出任务,等待完成");
doneSignal.await();
System.out.println("所有任务都已完成");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
非常谢谢两位的回答