Reputation: 821
I have a logging code which needs to be executed after all Threads
s are executed.
Thread t1 = new MyThread();
Thread t2 = new MyThread();
t1.run();
t2.run();
doLogging();
Is there any way to execute doLogging()
only after both threads are done with their processing. Now that doLogging()
is called as soon as t1 and t2 are started.
Upvotes: 7
Views: 8805
Reputation: 649
If you create threads using a thread pool, then you may use awaitTermination(long timeout, TimeUnit unit)
method. Once time up, it will return true if all threads are finished, otherwise return false.
if(awaitTermination(timeout, unit)){
//write your code here
}
However, since you need to estimate a timeout first, it's not as flexible as CountDownLatch. This method is usually used together with shutdown()
to double-check if all threads are shut down successfully given a waiting time.
Upvotes: 0
Reputation: 7261
In addition to the join() solution there is also something called CountDownLatch in the java.util.concurrent library. It allows you to initialize it to a certain number and then wait until it was hit the specified number of times.
Simple example:
CountDownLatch latch = new CountDownLatch(NUMBER_OF_THREADS);
for(int i=0; i<NUMBER_OF_THREADS;i++)
new Thread(myCode).start();
latch.await();
The latch must be explicitly hit by the worker threads for this to work though:
latch.countDown()
Upvotes: 6
Reputation: 308021
Just join()
all threads before your doLogging()
call:
t1.join();
t2.join();
// the following line will be executed when both threads are done
doLogging();
Note that the order of join()
calls doesn't matter if you want to wait for all of your threads.
Upvotes: 24