【问题标题】:How do I run a thread in java that lets me know when another thread has died?如何在 java 中运行一个线程,让我知道另一个线程何时死亡?
【发布时间】:2013-10-31 06:44:17
【问题描述】:

假设我在 java 中有一个线程 A。该线程继续执行一些任务 A。 我有另一个线程 B,它必须在任务 A 完成后才执行任务 B。如何在 Java 中实现这一点?

【问题讨论】:

    标签: java multithreading threadpool


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

      您可以使用 Thread Executor 来实现这一点。 Executor 将值保存在线程池中。参考这个链接,可能对你有帮助

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

      另见

      How to run thread after completing some specific worker thread

      【讨论】:

        【解决方案3】:

        在 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
                  }
               }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-06-28
          • 2010-12-13
          • 1970-01-01
          • 2011-05-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多