7

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

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

doLogging();

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

4

3 回答 3

24

就在您调用join()之前的所有线程:doLogging()

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

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

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

于 2009-09-29T11:52:40.473 回答
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()
于 2009-09-29T13:19:44.980 回答
0

如果您使用线程池创建线程,那么您可以使用awaitTermination(long timeout, TimeUnit unit)方法。一旦时间到,如果所有线程都完成则返回true,否则返回false。

if(awaitTermination(timeout, unit)){
    //write your code here
}

但是,由于您需要先估计超时时间,因此它不如 CountDownLatch 灵活。此方法通常与shutdown()在给定等待时间的情况下仔细检查是否所有线程都已成功关闭。

于 2021-09-17T01:30:06.420 回答