如何在所有线程完成后执行一段代码

sha*_*afi 7 java multithreading runnable

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

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

doLogging();
Run Code Online (Sandbox Code Playgroud)

是否有任何方法doLogging()只有在两个线程完成其处理后才能执行.现在,doLogging()只要t1和t2开始,就会调用它.

Joa*_*uer 23

只要join()你之前的所有线程doLogging()调用:

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

// the following line will be executed when both threads are done
doLogging();
Run Code Online (Sandbox Code Playgroud)

请注意,join()如果要等待所有线程,则调用顺序无关紧要.


Gre*_*zky 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();
Run Code Online (Sandbox Code Playgroud)

必须由工作线程明确地命中锁存器才能使其工作:

latch.countDown()
Run Code Online (Sandbox Code Playgroud)