Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to kill a Thread in Java that is in state RUNNING?

It is possible to kill a thread that is in state RUNNING in a non programatically way?

I know that top command in *nix can show threads. Can I kill the thread in the OS?

I'd like to know if there is a way to link a thread to a process so I can kill only that specific thread and not the application.

We had a bug in our code that kept a thread in state RUNNING in a synchronized method. The thread kept the lock on the object "hanging" the application.

The bug is fixed. But I wonder if is possible.

like image 728
ssedano Avatar asked Nov 18 '11 10:11

ssedano


2 Answers

The short answer is "maybe, but you should not and most of the time it won't work either".

The long answer is:

"Maybe..." Some JVM implementation map java threads to OS threads and some do not. If the JVM does a mapping to a native OS thread, you might be able to kill that thread with some process tool that the OS provides (like kill on *nix). If the JVM does green threads, meaning it doesn't map a Java thread to an OS level thread, then you are basically out of luck using OS level tools. Luckily only very few JVM implementations do this. An approach that can be used regardless in which way the JVM organizes it's threads, is using the java debugger. This article describes the procedure of doing it: http://www.rhcedan.com/2010/06/22/killing-a-java-thread/.

"but you should not do it" Killing a thread on the OS level will almost certainly leave the JVM in an undefined state (read "jvm might crash or delete all files on your disk or do whatever it fricking pleases to do"). Even when going the debugger way, only a very small amount of java applications (read "no application made on this planet") will properly handle the event that an outside application is killing one of it's threads. As a result these applications will be put in an undefined state (read "application might crash or delete all files on your disk or do whatever it fricking pleases to do").

"and most of the time it won't work either" If the thread is really stuck with some blocked IO etc, then killing the thread won't work, it will just not respond. If a program is stuck it's probably better to kill the whole program, find the issue with the program and fix it instead of killing a single thread.

like image 119
Jan Thomä Avatar answered Oct 15 '22 08:10

Jan Thomä


For all your doubts on killing a thread, refer this: http://download.oracle.com/javase/1.4.2/docs/guide/misc/threadPrimitiveDeprecation.html

like image 38
allwyn.menezes Avatar answered Oct 15 '22 09:10

allwyn.menezes