Bharath Naidu
Bharath Naidu

Reputation: 195

How do I run a thread in java that lets me know when another thread has died?

Assume that I have a thread A in java. This thread continues to perform some task A. I have another thread B that must perform a task B only after Task A is finished. How do I implement this in Java?

Upvotes: 0

Views: 164

Answers (3)

mkrakhin
mkrakhin

Reputation: 3486

In Java SE 7 you could use CountDownLatch. Here is an example. Good thing that comes with using of CountDownLatch is that you can initialize it with certain number of required countdowns, so you can wait for a set of threads. Also it doesn't require thread to be completed (like in join()), thread can call countDown() in any place you want and continue execution.
Also, another approach is CyclicBarrier.

    class Starter {
        public static void main(String[] args) {
            CountDownLatch signal = new CountDownLatch();
            Thread a = new Worker(signal);
            Thread b = new AnotherWorker(signal);
            a.start();
            b.start();
            //doSomethingElse
         }
     }

     class Worker extends Thread {
         CountDownLatch signal;
         Worker(CountDownLatch signal) {
             this.signal = signal;
         }

         public void run(){
             //doSomething
             signal.await(); //wait until thread b dies
             //doSomethingElse
         }
      }

      class AnotherWorker extends Thread {
          CountDownLatch signal;
          AnotherWorker(CountDownLatch signal) {
              this.signal = signal;
          }

          public void run(){
              //doSomething
              signal.countDown();  //notify a about finish
          }
       }

Upvotes: 0

Murali
Murali

Reputation: 339

You can use Thread Exceutor to acieve this. Executor keep the value in thread pool. Refer this link, It may help you

http://www.journaldev.com/1069/java-thread-pool-example-using-executors-and-threadpoolexecutor

see also

How to run thread after completing some specific worker thread

Upvotes: 0

Jon Skeet
Jon Skeet

Reputation: 1501153

You can use Thread.join() to basically block one thread until another thread terminates:

// In thread B
threadA.join();
doStuff();

Note that this won't work properly if you use a thread pool e.g. via an executor service. If you need to do that (and I'd generally recommend using executors instead of "raw" threads) you'd need to make the executor task notify any listeners that it has completed (e.g. via a CountDownLatch).

If you use Guava, you should look at ListenableFuture, too, which simplifies things.

Upvotes: 6

Related Questions