假设我在java中有一个线程A.该线程继续执行某些任务A. 我有另一个线程B,只有在任务A完成后才能执行任务B.我如何在Java中实现它?
答案 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
}
}