Groovy Operators

Control Statements

Groovy File Handling

Groovy Error & Exceptions

Groovy Multithreading

Groovy Synchronization

Groovy - Joining a Thread



Once a Thread object is created, you can start it by calling start() method, which executes a call to run() method. With multiple threads running, we can block current thread until another thread terminates.

Joining Threads in Groovy

Joining threads in Groovy refers for waiting (or, blocking) a thread until another thread finishes its execution. The join() method of the Thread class is used for this purpose.

Syntax

Following is a simple syntax of join() method −

void join();

Overloaded Thread.join() Methods

The following are the three overloaded join() method −

  • join() − The current thread invokes this method on a second thread, causing the current thread to block until the second thread terminates.

  • join(long millisec) − The current thread invokes this method on a second thread, causing the current thread to block until the second thread terminates or the specified number of milliseconds passes.

  • join(long millisec, int nanos) − The current thread invokes this method on a second thread, causing the current thread to block until the second thread terminates or the specified number of milliseconds + nanoseconds passes.

Example - Joining Threads

In this example, we're creating a class RunnableDemo by implementing Runnable interface. RunnableDemo class has run() method implementation. In main class TestThread, we've created the RunnableDemo objects and using those objects we've created two Thread objects. When Thread.start() method is called on each thread objects, threads start processing and program is executed. Using join() method, we're blocking the current thread which ensure that once thread is complete then only next thread will start.

Example.groovy

class Example {
   static void main(String[] args) throws InterruptedException {
      Thread t1 = new Thread( new RunnableDemo(), "Thread-1");
      Thread t2 = new Thread( new RunnableDemo(), "Thread-2");
      Thread t3 = new Thread( new RunnableDemo(), "Thread-3");
      // start t1 thread and join main thread
      t1.start();
      t1.join();	  
      // t2 will start when t1 is dead
      t2.start();        
      t2.join();
      // t3 will start when t2 is dead
      t3.start();
   }
}
class RunnableDemo implements Runnable {
   RunnableDemo( ) {
      println("Thread: " + Thread.currentThread().getName() + ", " + "State: New");
   }

   void run() {
      println("Thread: " + Thread.currentThread().getName() + ", " + "State: Running");
      for(int i = 4; i > 0; i--) {
         println("Thread: " + Thread.currentThread().getName() + ", " + i);         
      }
      println("Thread: " + Thread.currentThread().getName() + ", " + "State: Dead");
   }
}

Output

The above program produces the following output −

Thread: main, State: New
Thread: main, State: New
Thread: main, State: New
Thread: Thread-1, State: Running
Thread: Thread-1, 4
Thread: Thread-1, 3
Thread: Thread-1, 2
Thread: Thread-1, 1
Thread: Thread-1, State: Dead
Thread: Thread-2, State: Running
Thread: Thread-2, 4
Thread: Thread-2, 3
Thread: Thread-2, 2
Thread: Thread-2, 1
Thread: Thread-2, State: Dead
Thread: Thread-3, State: Running
Thread: Thread-3, 4
Thread: Thread-3, 3
Thread: Thread-3, 2
Thread: Thread-3, 1
Thread: Thread-3, State: Dead

Example - Joining threads using blocking time

In this example, we're creating a class RunnableDemo by implementing Runnable interface. RunnableDemo class has run() method implementation. In main class TestThread, we've created the RunnableDemo objects and using those objects we've created two Thread objects. When Thread.start() method is called on each thread objects, threads start processing and program is executed. Using join(long millisec) method, we're blocking the current thread for 200 millisecs which ensure that once thread is complete or a delay of 200 ms occurred then only next thread will start.

Example.groovy

class Example {
   static void main(String[] args) throws InterruptedException {
      Thread t1 = new Thread( new RunnableDemo(), "Thread-1");
      Thread t2 = new Thread( new RunnableDemo(), "Thread-2");
      Thread t3 = new Thread( new RunnableDemo(), "Thread-3");
      // start t1 thread and join main thread
      t1.start();
      t1.join(200);	  
      // t2 will start when t1 is dead or 200 ms is elapsed
      t2.start();        
      t2.join(200);
      // t3 will start when t2 is dead or 200 ms is elapsed
      t3.start();
   }
}
class RunnableDemo implements Runnable {
   RunnableDemo( ) {
      println("Thread: " + Thread.currentThread().getName() + ", " + "State: New");
   }

   public void run() {
      println("Thread: " + Thread.currentThread().getName() + ", " + "State: Running");
      for(int i = 4; i > 0; i--) {
         try {
            Thread.sleep(50);
         } catch (InterruptedException e) {
            // TODO Auto-generated catch block
         e.printStackTrace();
         }
         println("Thread: " + Thread.currentThread().getName() + ", " + i);         
      }
      println("Thread: " + Thread.currentThread().getName() + ", " + "State: Dead");
   }
}

Output

The above program produces the following output −

Thread: main, State: New
Thread: main, State: New
Thread: main, State: New
Thread: Thread-1, State: Running
Thread: Thread-1, 4
Thread: Thread-1, 3
Thread: Thread-1, 2
Thread: Thread-1, 1
Thread: Thread-2, State: Running
Thread: Thread-1, State: Dead
Thread: Thread-2, 4
Thread: Thread-2, 3
Thread: Thread-2, 2
Thread: Thread-3, State: Running
Thread: Thread-2, 1
Thread: Thread-2, State: Dead
Thread: Thread-3, 4
Thread: Thread-3, 3
Thread: Thread-3, 2
Thread: Thread-3, 1
Thread: Thread-3, State: Dead

Example - Joining threads with more accurate delay

In this example, we're creating a class RunnableDemo by implementing Runnable interface. RunnableDemo class has run() method implementation. In main class TestThread, we've created the RunnableDemo objects and using those objects we've created two Thread objects. When Thread.start() method is called on each thread objects, threads start processing and program is executed. Using join(long millisec, long nanoseconds) method, we're blocking the current thread for 200 millisecs and 100000 nanosecs which ensure that once thread is complete or a delay of 201 ms occurred then only next thread will start.

Example.groovy

class Example {
   static void main(String[] args) throws InterruptedException {
      Thread t1 = new Thread( new RunnableDemo(), "Thread-1");
      Thread t2 = new Thread( new RunnableDemo(), "Thread-2");
      Thread t3 = new Thread( new RunnableDemo(), "Thread-3");
      
      // start t1 thread and join main thread
      t1.start();
      t1.join(200,100000);	  
      
      // t2 will start when t1 is dead or 201 ms is elapsed
      t2.start();        
      t2.join(200,100000);
      
      // t3 will start when t2 is dead or 201 ms is elapsed
      t3.start();
   }
}

class RunnableDemo implements Runnable {
   RunnableDemo( ) {
      println("Thread: " + Thread.currentThread().getName() + ", " + "State: New");
   }

   public void run() {
      println("Thread: " + Thread.currentThread().getName() + ", " + "State: Running");
      for(int i = 4; i > 0; i--) {
         try {
            Thread.sleep(49);
         } catch (InterruptedException e) {
            // TODO Auto-generated catch block
         e.printStackTrace();
         }
         println("Thread: " + Thread.currentThread().getName() + ", " + i);         
      }
      println("Thread: " + Thread.currentThread().getName() + ", " + "State: Dead");
   }
}

Output

The above program produces the following output −

Thread: main, State: New
Thread: main, State: New
Thread: main, State: New
Thread: Thread-1, State: Running
Thread: Thread-1, 4
Thread: Thread-1, 3
Thread: Thread-1, 2
Thread: Thread-1, 1
Thread: Thread-1, State: Dead
Thread: Thread-2, State: Running
Thread: Thread-2, 4
Thread: Thread-2, 3
Thread: Thread-2, 2
Thread: Thread-2, 1
Thread: Thread-2, State: Dead
Thread: Thread-3, State: Running
Thread: Thread-3, 4
Thread: Thread-3, 3
Thread: Thread-3, 2
Thread: Thread-3, 1
Thread: Thread-3, State: Dead
Advertisements