Groovy Operators

Control Statements

Groovy File Handling

Groovy Error & Exceptions

Groovy Multithreading

Groovy Synchronization

Groovy - Interrupting Thread



A thread can send an interrupt signal to JVM to interrupt by invoking interrupt on the Thread object for the thread to be interrupted. This means interruption of a thread is caused by any other thread calling the interrupt() method.

Methods for Interrupting a Thread

The Thread class provides three methods for interrupting a thread −

  • void interrupt() − Interrupts the thread.

  • static boolean interrupted() − Tests whether the current thread has been interrupted.

  • boolean isInterrupted() − Tests whether the thread has been interrupted.

Example - Interrupting a Thread

In this example, we're creating a Task object which has implemented Runnable interface to act as a thread. Using start() method, we've started the thread. As next statement, we're interrupting the thread using interrupt() method and we're printing thread properties in run() method.

Example.groovy

class Example {
   static void main(String[] args) {
      println("Thread main started");
      final Task task = new Task();
      final Thread thread = new Thread(task);
      thread.start();
      thread.interrupt(); // calling interrupt() method
      println("Main Thread finished");
   }
}
class Task implements Runnable {
   @Override
   void run() {
      for (int i = 0; i < 5; i++) {
         println("[" + Thread.currentThread().getName() + "] Message " + i);
         if(Thread.interrupted()) {
            println("This thread was interruped by someone calling this Thread.interrupt()");
            println("Cancelling task running in thread " + Thread.currentThread().getName());
            println("After Thread.interrupted() call, JVM reset the interrupted value to: " + Thread.interrupted());
            break;
         }
      }
   }
}

Output

This will produce the following result−

Thread main started
Main Thread finished
[Thread-0] Message 0
This thread was interruped by someone calling this Thread.interrupt()
Cancelling task running in thread Thread-0
After Thread.interrupted() call, JVM reset the interrupted value to: false

Example - Interrupting a Thread with InterruptedException Handling

In this example, we're handling the interruption and continuing the thread. We're creating a Task object which has implemented Runnable interface to act as a thread. Using start() method, we've started the thread. As next statement, we're interrupting the thread using interrupt() method and we're handling InterruptedException in run() method and printing the details.

Example.groovy

class Example {
   static void main(String[] args) {
      println("Thread main started");
      final Task task = new Task();
      final Thread thread = new Thread(task);
      thread.start();
      thread.interrupt(); // calling interrupt() method
      println("Main Thread finished");
   }
}
class Task implements Runnable {
   @Override
   void run() {
      for (int i = 0; i < 5; i++) {
         println("[" + Thread.currentThread().getName() + "] Message " + i);
         try {
			Thread.sleep(50);
		} catch (InterruptedException e) {
			println("This thread was interruped by someone calling this Thread.interrupt()");
		}        
      }
   }
}

Output

This will produce the following result−

Thread main started
Main Thread finished
[Thread-0] Message 0
This thread was interruped by someone calling this Thread.interrupt()
[Thread-0] Message 1
[Thread-0] Message 2
[Thread-0] Message 3
[Thread-0] Message 4

Example - Checking Whether Thread is Interrupted or Not

In this example, we're showcasing multiple threads and use of interrupted() method to check if a thread is interrupted or not. We're creating multiple Task objects which has implemented Runnable interface to act as a thread. Using start() method, we've starting the threads. Then, we're interrupting a thread using interrupt() method and using interrupted in run() method, we're printing the details.

Example.groovy

class Example {
   static void main(String[] args) {
      println("Thread main started");
      final Task task1 = new Task();
      final Thread thread1 = new Thread(task1);
      final Task task2 = new Task();
      final Thread thread2 = new Thread(task2);
      final Task task3 = new Task();
      final Thread thread3 = new Thread(task3);
      thread1.start();
      thread2.start();
      thread3.start();
      thread1.interrupt(); // calling interrupt() method
      println("Main Thread finished");
   }
}
class Task implements Runnable {
   @Override
   void run() {
      if(Thread.interrupted()) {
         println("[" + Thread.currentThread().getName() + "] Interrupted ");
      }else {
         println("[" + Thread.currentThread().getName() + "] Uninterrupted ");
      }
   }
}

Output

This will produce the following result−

Thread main started
Main Thread finished
[Thread-2] Uninterrupted 
[Thread-0] Interrupted 
[Thread-1] Uninterrupted 
Advertisements