我有一个日志代码,需要在执行完所有Threads
之后执行。如何在所有线程完成后才执行一段代码
Thread t1 = new MyThread();
Thread t2 = new MyThread();
t1.run();
t2.run();
doLogging();
只有在两个线程完成处理之后,才有任何方法可以执行doLogging()
。现在,只要t1和t2启动,就会调用doLogging()
。
我有一个日志代码,需要在执行完所有Threads
之后执行。如何在所有线程完成后才执行一段代码
Thread t1 = new MyThread();
Thread t2 = new MyThread();
t1.run();
t2.run();
doLogging();
只有在两个线程完成处理之后,才有任何方法可以执行doLogging()
。现在,只要t1和t2启动,就会调用doLogging()
。
只是join()
您doLogging()
调用之前的所有主题:
t1.join();
t2.join();
// the following line will be executed when both threads are done
doLogging();
注意,如果你想等待所有线程的join()
调用的顺序并不重要。
谢谢。这工作:) – shafi 2009-09-29 12:21:07
请注意,如果您使用Java 1.5或更高版本,新的java.util.concurrent应该比低级线程编程更受欢迎(请参阅Gregory Mostizky的回答)。 – 2009-11-29 16:39:59
@Jim:对于Java 1.5或更高版本,我甚至不会使用CountDownLatch作为这样的事情,而是使用简单的Executor。 – 2009-11-29 17:51:49
如果您正在从主线程运行代码,请记住它会导致UI挂起,直到两个线程完成。这可能不是预期的效果。
相反,您可以考虑一个构造,其中每个线程在您的Logger
对象上同步并在该构造内对其执行调用。由于我不知道你在做什么,所以其他的解决方案是Joachim建议的,只将这些代码放在一个线程中。
除了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()
+1 for java.util.concurrent。这个新特性使得Java中的大多数低级别线程编程变得不必要。 – 2009-11-29 16:37:43
应当指出,由于您所呼叫的运行,而不是启动你已经获得了理想的行为。 – 2009-09-29 12:56:04