0

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

4

3 回答 3

6

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

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

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

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

于 2013-10-31T06:45:52.603 回答
0

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

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

也可以看看

完成某些特定工作线程后如何运行线程

于 2013-10-31T06:48:59.773 回答
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
          }
       }
于 2013-10-31T07:04:47.013 回答