假设我在 java 中有一个线程 A。该线程继续执行某些任务 A。我有另一个线程 B,它必须在任务 A 完成后才执行任务 B。我如何在 Java 中实现它?
问问题
148 次
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 回答