如何在java中运行一个线程,让我知道另一个线程何时死亡?

时间:2013-10-31 06:44:17

标签: java multithreading threadpool

假设我在java中有一个线程A.该线程继续执行某些任务A. 我有另一个线程B,只有在任务A完成后才能执行任务B.我如何在Java中实现它?

3 个答案:

答案 0 :(得分:6)

您可以使用Thread.join()基本上阻止一个线程,直到另一个线程终止:

// In thread B
threadA.join();
doStuff();

请注意,如果您使用线程池,则无法正常工作,例如通过遗嘱执行人服务。如果您需要这样做(我通常建议使用执行程序而不是“原始”线程),您需要让执行程序任务通知任何侦听器它已完成(例如通过CountDownLatch)。 / p>

如果你使用Guava,你也应该看ListenableFuture,这简化了事情。

答案 1 :(得分:0)

您可以使用Thread Executor来实现此目的。执行程序将值保留在线程池中。请参阅此链接,它可能会对您有所帮助

http://www.journaldev.com/1069/java-thread-pool-example-using-executors-and-threadpoolexecutor

另见

How to run thread after completing some specific worker thread

答案 2 :(得分:0)

在Java SE 7中,您可以使用CountDownLatch。这是一个例子。使用CountDownLatch带来的好处是你可以用一定数量的所需倒计时来初始化它,这样你就可以等待一组线程了。此外,它不需要完成线程(如在join()中),线程可以在任何你想要的地方调用countDown()并继续执行。
另外,另一种方法是CyclicBarrier

    class Starter {
        public static void main(String[] args) {
            CountDownLatch signal = new CountDownLatch();
            Thread a = new Worker(signal);
            Thread b = new AnotherWorker(signal);
            a.start();
            b.start();
            //doSomethingElse
         }
     }

     class Worker extends Thread {
         CountDownLatch signal;
         Worker(CountDownLatch signal) {
             this.signal = signal;
         }

         public void run(){
             //doSomething
             signal.await(); //wait until thread b dies
             //doSomethingElse
         }
      }

      class AnotherWorker extends Thread {
          CountDownLatch signal;
          AnotherWorker(CountDownLatch signal) {
              this.signal = signal;
          }

          public void run(){
              //doSomething
              signal.countDown();  //notify a about finish
          }
       }