Interrupting a Thread in Java
A thread can send an interrupt signal to 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 provides three methods for interrupting a thread –
-
− Interrupts the thread.
-
− Tests whether the current thread has been interrupted.
-
− Tests whether the thread has been interrupted.
Example of Interrupting a Java Thread
In this example, we”re creating a Task object which has implemented Runnable interface to act as a thread. Using , we”ve started the thread. As next statement, we”re interrupting the thread using interrupt() method and we”re printing thread properties in .
package com.tutorialspoint; public class TestThread { public static void main(String[] args) { System.out.println("Thread main started"); final Task task = new Task(); final Thread thread = new Thread(task); thread.start(); thread.interrupt(); // calling interrupt() method System.out.println("Main Thread finished"); } } class Task implements Runnable { @Override public void run() { for (int i = 0; i < 5; i++) { System.out.println("[" + Thread.currentThread().getName() + "] Message " + i); if(Thread.interrupted()) { System.out.println("This thread was interruped by someone calling this Thread.interrupt()"); System.out.println("Cancelling task running in thread " + Thread.currentThread().getName()); System.out.println("After Thread.interrupted() call, JVM reset the interrupted value to: " + Thread.interrupted()); break; } } } }
Output
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 of Interrupting a Java 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.
package com.tutorialspoint; public class TestThread { public static void main(String[] args) { System.out.println("Thread main started"); final Task task = new Task(); final Thread thread = new Thread(task); thread.start(); thread.interrupt(); // calling interrupt() method System.out.println("Main Thread finished"); } } class Task implements Runnable { @Override public void run() { for (int i = 0; i < 5; i++) { System.out.println("[" + Thread.currentThread().getName() + "] Message " + i); try { Thread.sleep(50); } catch (InterruptedException e) { System.out.println("This thread was interruped by someone calling this Thread.interrupt()"); } } } }
Output
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 of 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.
package com.tutorialspoint; public class TestThread { public static void main(String[] args) { System.out.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 System.out.println("Main Thread finished"); } } class Task implements Runnable { @Override public void run() { if(Thread.interrupted()) { System.out.println("[" + Thread.currentThread().getName() + "] Interrupted "); }else { System.out.println("[" + Thread.currentThread().getName() + "] Uninterrupted "); } } }
Output
Thread main started Main Thread finished [Thread-2] Uninterrupted [Thread-0] Interrupted [Thread-1] Uninterrupted