我有一个日志记录代码,需要在所有Threads
s 执行后执行。
Thread t1 = new MyThread();
Thread t2 = new MyThread();
t1.run();
t2.run();
doLogging();
doLogging()
只有在两个线程都完成处理后才能执行。现在,doLogging()
只要 t1 和 t2 启动,就会调用它。
我有一个日志记录代码,需要在所有Threads
s 执行后执行。
Thread t1 = new MyThread();
Thread t2 = new MyThread();
t1.run();
t2.run();
doLogging();
doLogging()
只有在两个线程都完成处理后才能执行。现在,doLogging()
只要 t1 和 t2 启动,就会调用它。
就在您调用join()
之前的所有线程:doLogging()
t1.join();
t2.join();
// the following line will be executed when both threads are done
doLogging();
请注意,join()
如果您想等待所有线程,调用顺序并不重要。
除了 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()
如果您使用线程池创建线程,那么您可以使用awaitTermination(long timeout, TimeUnit unit)
方法。一旦时间到,如果所有线程都完成则返回true,否则返回false。
if(awaitTermination(timeout, unit)){
//write your code here
}
但是,由于您需要先估计超时时间,因此它不如 CountDownLatch 灵活。此方法通常与shutdown()
在给定等待时间的情况下仔细检查是否所有线程都已成功关闭。