Java - Interrupting Thread
Interrupting a Thread in Java
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 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 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.
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