From Baeldung.com:
How to stop a thread:
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:
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:
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.