毕业论文开发语言企业开发JAVA技术.NET技术WEB开发Linux/Unix数据库技术Windows平台移动平台嵌入式论文范文英语论文
您现在的位置: 毕业论文 >> java技术 >> 正文

CountDownLatch循环语句只执行了一次

更新时间:2013-4-29:  来源:毕业论文

CountDownLatch循环语句只执行了一次

不知道为什么下面的代码没有执行循环,只执行了一次?请大侠帮忙解答,十分感谢


Java code?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();         }     }       }
CountDownLatch不可重复使用,当计数器减少到0之后,就废了,无法继续使用了。
你在循环外创建CountDownLatch,在循环内使用,肯定是不行的,创建语句也应该写到循环内图书管理系统论文 

这是另一个例子,可以得到正确结果,CountDownLatch是不可重用,不过跟是否在循环内部创建应该没有关系吧,只要保证它们是同一个CountDownLatch,就可以了,上面那个Driver的例子里,通过构造函数传递给Worker,应该都是同一个CountDownLatch,我也是根据API里的示例,照葫芦画瓢画出来的,自己实在看不出两个例子有什么区别,不都是通过Runable对象启动么,是不是就是通过构造函数传递CountDownLatch那里出了问题,还请能够做进一步解答,感激不尽


API示例

Java code? 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() { ... }  } 

[1] [2] 下一页

设为首页 | 联系站长 | 友情链接 | 网站地图 |

copyright©youerw.com 优尔论文网 严禁转载
如果本毕业论文网损害了您的利益或者侵犯了您的权利,请及时联系,我们一定会及时改正。