【发布时间】:2013-10-31 06:44:17
【问题描述】:
假设我在 java 中有一个线程 A。该线程继续执行一些任务 A。 我有另一个线程 B,它必须在任务 A 完成后才执行任务 B。如何在 Java 中实现这一点?
【问题讨论】:
标签: java multithreading threadpool
假设我在 java 中有一个线程 A。该线程继续执行一些任务 A。 我有另一个线程 B,它必须在任务 A 完成后才执行任务 B。如何在 Java 中实现这一点?
【问题讨论】:
标签: java multithreading threadpool
您可以使用Thread.join() 基本上阻塞一个线程,直到另一个线程终止:
// In thread B
threadA.join();
doStuff();
请注意,如果您使用线程池,这将无法正常工作,例如通过执行器服务。如果您需要这样做(我通常建议使用执行器而不是“原始”线程),您需要让执行器任务通知任何侦听器它已完成(例如通过CountDownLatch)。
如果你使用Guava,你也应该看看ListenableFuture,这样可以简化事情。
【讨论】:
您可以使用 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
【讨论】:
在 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
}
}
【讨论】: