如何在所有线程完成后执行一段代码

时间:2009-09-29 11:51:07

标签: java multithreading runnable

我有一个日志代码,需要在执行所有Threads后执行。

Thread t1 = new MyThread();
Thread t2 = new MyThread();
t1.run();
t2.run();

doLogging();

只有在两个线程完成处理后才能执行doLogging()。现在,只要t1和t2开始就调用doLogging()

3 个答案:

答案 0 :(得分:21)

doLogging()来电之前,只需join()个帖子:

t1.join();
t2.join();

// the following line will be executed when both threads are done
doLogging();

请注意,如果您想等待所有线程,join()次调用的顺序无关紧要。

答案 1 :(得分:6)

除了join()解决方案之外,java.util.concurrent库中还有一些名为CountDownLatch的东西。它允许您将其初始化为某个数字,然后等待它达到指定的次数。

简单示例:

CountDownLatch latch = new CountDownLatch(NUMBER_OF_THREADS);
for(int i=0; i<NUMBER_OF_THREADS;i++)
   new Thread(myCode).start();

latch.await();

工作线程必须明确地锁定锁存器才能使其工作:

latch.countDown()

答案 2 :(得分:0)

如果您正在运行主线程中的代码,请记住它会导致UI挂起,直到两个线程完成。这可能不是预期的效果。

相反,您可以考虑一种构造,其中每个线程在您的Logger对象上进行同步,并在该构造中执行对它的调用。由于我不知道你特意想要完成什么,另一个解决方案是Joachim建议的,只是将代码放在一个线程中。