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:

Circular Dependencies in Spring
Write/Read cookies using HTTP and Read a file from the internet
Spring WebFlux Filters
Java TreeMap vs HashMap
Java Program to Perform Encoding of a Message Using Matrix Multiplication
Mapping a Dynamic JSON Object with Jackson
Validate email address exists or not by Java Code
Java Program to Implement Fermat Primality Test Algorithm
Java Program to Implement LinkedHashSet API
Multi Dimensional ArrayList in Java
SOAP Web service: Upload và Download file sử dụng MTOM trong JAX-WS
Guide to the Synchronized Keyword in Java
Hướng dẫn Java Design Pattern – Facade
RestTemplate Post Request with JSON
Java Program to Implement Euler Circuit Problem
Java Program to Find Transpose of a Graph Matrix
Giới thiệu SOAP UI và thực hiện test Web Service
Java Program to Implement Sparse Array
Sending Emails with Java
Java Program to Perform Inorder Recursive Traversal of a Given Binary Tree
Java 8 Stream findFirst() vs. findAny()
Java Program to Create a Random Graph Using Random Edge Generation
Java Program to Implement Repeated Squaring Algorithm
Java Program to Implement Skip List
Java Program to Implement an Algorithm to Find the Global min Cut in a Graph
Java Program to Implement RoleUnresolvedList API
HashSet trong Java hoạt động như thế nào?
Java Switch Statement
Java – Convert File to InputStream
Java Program to Implement VList
Java Program to Implement Sparse Matrix
Java Program to Search Number Using Divide and Conquer with the Aid of Fibonacci Numbers