A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

© yanghao 中级黑马   /  2014-10-3 14:12  /  1236 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 yanghao 于 2014-10-3 14:14 编辑

downSingal 的作用是什么 类似一个阻塞锁吗
import java.util.Random;
import java.util.concurrent.CountDownLatch;

class Driver { // ...
  public static void main(String[] argus) throws InterruptedException {
     CountDownLatch startSignal = new CountDownLatch(1);
     CountDownLatch doneSignal = new CountDownLatch(3);

     for (int i = 0; i < 3; ++i) // create and start threads
       new Thread(new Worker2(startSignal, doneSignal)).start();

   System.out.println(Thread.currentThread().getName()+1);            // don't let run yet
     startSignal.countDown();      // let all threads proceed
     Thread.sleep(new Random().nextInt(3000));
  System.out.println(Thread.currentThread().getName()+2);
//  doneSignal.countDown();
//  doneSignal.countDown();
//  doneSignal.countDown();
     doneSignal.await();           // wait for all to finish  在此处堵塞,只有计数器减为零才继续
     System.out.println("over");
   }
}

class Worker2 implements Runnable {
   private final CountDownLatch startSignal;
   private final CountDownLatch doneSignal;
   Worker2(CountDownLatch startSignal, CountDownLatch doneSignal) {
      this.startSignal = startSignal;
      this.doneSignal = doneSignal;
   }
   public void run() {
      try {
        startSignal.await();
        Thread.sleep(new Random().nextInt(3000));
        doWork();
        doneSignal.countDown();
} catch (InterruptedException ex) {} // return;
   }

   void doWork() { System.out.println(Thread.currentThread().getName()+3); }
}
  1. import java.util.Random;
  2. import java.util.concurrent.CountDownLatch;

  3. class Driver { // ...
  4.   public static void main(String[] argus) throws InterruptedException {
  5.      CountDownLatch startSignal = new CountDownLatch(1);
  6.      CountDownLatch doneSignal = new CountDownLatch(3);

  7.      for (int i = 0; i < 3; ++i) // create and start threads
  8.        new Thread(new Worker2(startSignal, doneSignal)).start();

  9.    System.out.println(Thread.currentThread().getName()+1);            // don't let run yet
  10.      startSignal.countDown();      // let all threads proceed
  11.      Thread.sleep(new Random().nextInt(3000));
  12.   System.out.println(Thread.currentThread().getName()+2);
  13. //  doneSignal.countDown();
  14. //  doneSignal.countDown();
  15. //  doneSignal.countDown();
  16.      doneSignal.await();           // wait for all to finish  在此处堵塞,只有计数器减为零才继续
  17.      System.out.println("over");
  18.    }
  19. }

  20. class Worker2 implements Runnable {
  21.    private final CountDownLatch startSignal;
  22.    private final CountDownLatch doneSignal;
  23.    Worker2(CountDownLatch startSignal, CountDownLatch doneSignal) {
  24.       this.startSignal = startSignal;
  25.       this.doneSignal = doneSignal;
  26.    }
  27.    public void run() {
  28.       try {
  29.         startSignal.await();
  30.         Thread.sleep(new Random().nextInt(3000));
  31.         doWork();
  32.         doneSignal.countDown();
  33. } catch (InterruptedException ex) {} // return;
  34.    }

  35.    void doWork() { System.out.println(Thread.currentThread().getName()+3); }
  36. }
复制代码




1 个回复

倒序浏览
downSingal 还是 doneSignal?没找着downSingal啊,doneSingal是Worker2三个线程干完自己的事通知主线程可以继续向下走了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马