How to Kill a Java Thread

1. Introduction

In this brief article, we’ll cover stopping a Thread in Java – which is not that simple since the Thread.stop() method is deprecated.

As explained in this update from Oracle, stop() can lead to monitored objects being corrupted.

2. Using a Flag

Let’s start with a class that creates and starts a thread. This task won’t end on its own, so we need some way of stopping that thread.

We’ll use an atomic flag for that:

public class ControlSubThread implements Runnable {

    private Thread worker;
    private final AtomicBoolean running = new AtomicBoolean(false);
    private int interval;

    public ControlSubThread(int sleepInterval) {
        interval = sleepInterval;
    }
 
    public void start() {
        worker = new Thread(this);
        worker.start();
    }
 
    public void stop() {
        running.set(false);
    }

    public void run() { 
        running.set(true);
        while (running.get()) {
            try { 
                Thread.sleep(interval); 
            } catch (InterruptedException e){ 
                Thread.currentThread().interrupt();
                System.out.println(
                  "Thread was interrupted, Failed to complete operation");
            }
            // do something here 
         } 
    } 
}

Rather than having a while loop evaluating a constant true, we’re using an AtomicBoolean and now we can start/stop execution by setting it to true/false.

As explained in our introduction to Atomic Variables, using an AtomicBoolean prevents conflicts in setting and checking the variable from different threads.

3. Interrupting a Thread

What happens when sleep() is set to a long interval, or if we’re waiting for a lock that might never be released?

We face the risk of blocking for a long period or never terminating cleanly.

We can create the interrupt() for these situations, let’s add a few methods and a new flag to the class:

public class ControlSubThread implements Runnable {

    private Thread worker;
    private AtomicBoolean running = new AtomicBoolean(false);
    private int interval;

    // ...

    public void interrupt() {
        running.set(false);
        worker.interrupt();
    }

    boolean isRunning() {
        return running.get();
    }

    boolean isStopped() {
        return stopped.get();
    }

    public void run() {
        running.set(true);
        stopped.set(false);
        while (running.get()) {
            try {
                Thread.sleep(interval);
            } catch (InterruptedException e){
                Thread.currentThread().interrupt();
                System.out.println(
                  "Thread was interrupted, Failed to complete operation");
            }
            // do something
        }
        stopped.set(true);
    }
}

We’ve added an interrupt() method that sets our running flag to false and calls the worker thread’s interrupt() method.

If the thread is sleeping when this is called, sleep() will exit with an InterruptedException, as would any other blocking call.

This returns the thread to the loop, and it will exit since running is false.

4. Conclusion

In this quick tutorial, we looked at how to use an atomic variable, optionally combined with a call to interrupt(), to cleanly shut down a thread. This is definitely preferable to calling the deprecated stop() method and risking locking forever and memory corruption.

As always, the full source code is available over on GitHub.

Related posts:

Convert XML to JSON Using Jackson
Wiring in Spring: @Autowired, @Resource and @Inject
Java Program to Implement Sorted Array
Spring MVC Tutorial
Creating a Generic Array in Java
Java Program for Topological Sorting in Graphs
Java Program to Implement Iterative Deepening
Java Program to Implement the Binary Counting Method to Generate Subsets of a Set
Hướng dẫn Java Design Pattern – Abstract Factory
Guide to java.util.concurrent.BlockingQueue
Các kiểu dữ liệu trong java
Java – Reader to InputStream
Default Password Encoder in Spring Security 5
A Comparison Between Spring and Spring Boot
Java Program to Implement Sorted Circularly Singly Linked List
Quick Guide to the Java StringTokenizer
Tiêu chuẩn coding trong Java (Coding Standards)
Java Program to Decode a Message Encoded Using Playfair Cipher
Spring Boot - Actuator
Java Program to Generate Random Partition out of a Given Set of Numbers or Characters
Simultaneous Spring WebClient Calls
So sánh HashSet, LinkedHashSet và TreeSet trong Java
Java Program to Check Whether a Given Point is in a Given Polygon
Java Program to Implement First Fit Decreasing for 1-D Objects and M Bins
wait() and notify() Methods in Java
Java Program to Implement Hash Tables chaining with Singly Linked Lists
Introduction to Using Thymeleaf in Spring
Java Program to Implement Merge Sort Algorithm on Linked List
A Guide To UDP In Java
So sánh HashMap và HashSet trong Java
Hướng dẫn Java Design Pattern – Bridge
Java Program to Find the Peak Element of an Array O(n) time (Naive Method)