4

我们有两个线程 J1 和 J2。我们如何确保线程 J2 仅在 J1 完成执行后才运行,而不使用join()方法。

4

3 回答 3

4

很简单,使用CountDownLatch.

将 中的 初始化CountDownLatch为 1 main()。将其传递给 J1 和 J2。J2 只是使用 . 等待 Latch 变为 0 await()。使用 完成后,J2 将其设置为 0 countDown(),指示 J1 开始。

于 2013-05-12T16:18:15.753 回答
1

我认为这与 Thread.join 所做的非常接近

public class Test1 {

    public static void main(String[] args) throws Exception {
        Thread t = new Thread();
        synchronized (t) {
            t.start();
            while (t.isAlive()) {
                t.wait();
            }
        }
    }
}

请注意魔术 - 某些东西会唤醒 t.wait() - 这是因为 JVM 会在 Thread 对象终止时通知它

于 2013-05-12T15:43:03.280 回答
0

实现此目的的另一种方法是使用

   class X {
         private final ReentrantLock lock = new ReentrantLock();
          // ...

         public void m() { 
           lock.lock();  // block until condition holds
           try {
              // ... method body
          } finally {
               lock.unlock()
          }
        }
   } 
于 2013-05-12T16:34:30.507 回答