我有一个日志代码,需要在执行所有Threads
后执行。
Thread t1 = new MyThread();
Thread t2 = new MyThread();
t1.run();
t2.run();
doLogging();
只有在两个线程完成处理后才能执行doLogging()
。现在,只要t1和t2开始就调用doLogging()
。
答案 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建议的,只是将代码放在一个线程中。