views:

180

answers:

3

Hi,

I have a logging code which needs to be executed after all threads 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, t2 are started.

Thanks, Shafi

+15  A: 

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.

Joachim Sauer
Thanks. That worked :)
shafi
Note that if you're using Java 1.5 or later the new java.util.concurrent should be preferred over low-level thread programming (see Gregory Mostizky's answer).
Jim Ferrans
@Jim: with Java 1.5 or later I wouldn't even use a CountDownLatch for such a thing, but a simple Executor.
Joachim Sauer
A: 

If you are running the code from the main thread, bear in mind that it will cause the UI to hang until both threads complete. This may not be the desired effect.

Instead, you could consider a construction where each thread synchronizes over your Logger object and perform calls to it within that construct. Since I don't know what you are specifically trying to accomplish, the other solution is what Joachim suggested, only placing that code within a thread.

Paul Lammertsma
+5  A: 

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()
Gregory Mostizky
+1 for java.util.concurrent. This new feature makes most low-level thread programming in Java unnecessary.
Jim Ferrans