Interrupting a Thread in Java: Methods and Best Practices
Learn how to manage thread interruption in Java to safely and effectively halt thread execution. Discover the methods interrupt()
, interrupted()
, and isInterrupted()
, which provide control over interrupting threads at safe points during their execution.
Interrupting a Thread in Java
Thread interruption in Java is the process of stopping a thread's execution either immediately or at a safe point. Java provides methods to manage thread interruption, such as interrupt()
, interrupted()
, and isInterrupted()
.
Methods Provided by the Thread Class
The following methods are provided by the Thread
class for interrupting a thread:
public void interrupt()
: Interrupts the thread, causing it to break out of a sleeping or waiting state.public static boolean interrupted()
: Returns the interrupted status of the current thread and clears the interrupted status flag.public boolean isInterrupted()
: Returns the interrupted status of the thread without clearing the interrupted status flag.
Examples of Interrupting Threads
Example 1: Interrupting a Thread that Stops Working
In this example, after interrupting the thread, we propagate the InterruptedException
, causing the thread to stop working.
FileName: TestInterruptingThread1.java
class TestInterruptingThread1 extends Thread {
public void run() {
try {
Thread.sleep(1000);
System.out.println("Task");
} catch(InterruptedException e) {
throw new RuntimeException("Thread interrupted..." + e);
}
}
public static void main(String args[]) {
TestInterruptingThread1 t1 = new TestInterruptingThread1();
t1.start();
try {
t1.interrupt();
} catch(Exception e) {
System.out.println("Exception handled " + e);
}
}
}
Output
Exception in thread "Thread-0"
java.lang.RuntimeException: Thread interrupted...java.lang.InterruptedException: sleep interrupted
at TestInterruptingThread1.run(TestInterruptingThread1.java:7)
Example 2: Interrupting a Thread that Continues Working
In this example, after interrupting the thread, we handle the InterruptedException
gracefully, allowing the thread to continue its task.
FileName: TestInterruptingThread2.java
class TestInterruptingThread2 extends Thread {
public void run() {
try {
Thread.sleep(1000);
System.out.println("Task");
} catch(InterruptedException e) {
System.out.println("Exception handled " + e);
}
System.out.println("Thread is running...");
}
public static void main(String args[]) {
TestInterruptingThread2 t1 = new TestInterruptingThread2();
t1.start();
t1.interrupt();
}
}
Output
Exception handled java.lang.InterruptedException: sleep interrupted
Thread is running...
Example 3: Interrupting a Thread that Behaves Normally
If a thread is not in a sleeping or waiting state, calling interrupt()
sets the interrupted flag. The behavior depends on how the thread handles this flag.
FileName: TestInterruptingThread3.java
class TestInterruptingThread3 extends Thread {
public void run() {
for(int i = 1; i <= 5; i++)
System.out.println(i);
}
public static void main(String args[]) {
TestInterruptingThread3 t1 = new TestInterruptingThread3();
t1.start();
t1.interrupt();
}
}
Output
1
2
3
4
5
Using isInterrupted() and interrupted() Methods
The isInterrupted()
and interrupted()
methods provide ways to check the interrupted status of a thread:
FileName: TestInterruptingThread4.java
public class TestInterruptingThread4 extends Thread {
public void run() {
for(int i = 1; i <= 2; i++) {
if(Thread.interrupted()) {
System.out.println("Code for interrupted thread");
} else {
System.out.println("Code for normal thread");
}
}
}
public static void main(String args[]) {
TestInterruptingThread4 t1 = new TestInterruptingThread4();
TestInterruptingThread4 t2 = new TestInterruptingThread4();
t1.start();
t1.interrupt();
t2.start();
}
}
Output
Code for interrupted thread
Code for normal thread
Code for normal thread
Code for normal thread