2009-09-29 66 views
6

我有一个日志代码,需要在执行完所有Threads之后执行。如何在所有线程完成后才执行一段代码

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

doLogging(); 

只有在两个线程完成处理之后,才有任何方法可以执行doLogging()。现在,只要t1和t2启动,就会调用doLogging()

+2

应当指出,由于您所呼叫的运行,而不是启动你已经获得了理想的行为。 – 2009-09-29 12:56:04

回答

19

只是join()doLogging()调用之前的所有主题:

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

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

注意,如果你想等待所有线程的join()调用的顺序并不重要。

+0

谢谢。这工作:) – shafi 2009-09-29 12:21:07

+0

请注意,如果您使用Java 1.5或更高版本,新的java.util.concurrent应该比低级线程编程更受欢迎(请参阅Gregory Mostizky的回答)。 – 2009-11-29 16:39:59

+0

@Jim:对于Java 1.5或更高版本,我甚至不会使用CountDownLatch作为这样的事情,而是使用简单的Executor。 – 2009-11-29 17:51:49

0

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

相反,您可以考虑一个构造,其中每个线程在您的Logger对象上同步并在该构造内对其执行调用。由于我不知道你在做什么,所以其他的解决方案是Joachim建议的,只将这些代码放在一个线程中。

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() 
+0

+1 for java.util.concurrent。这个新特性使得Java中的大多数低级别线程编程变得不必要。 – 2009-11-29 16:37:43

相关问题