Question

Is it possible to kill a Java thread without raising an exception in it?

This is just for testing purposes - I want to simulate a case when the entire computer dies mid-thread.

Note - I saw a deprecated Thread.destroy() method, but the documentation says it never got implemented in the first place.

Was it helpful?

Solution

No. There is the deprecated, 'inherently unsafe' Thread.stop() method, but as its comment emphasizes, things could be left in an deeply corrupted state, and the ThreadDeath Error is still thrown inside the thread.

Sun's explanation of the problems with stop(), which can manifest long after it appears to work, is at:

http://java.sun.com/j2se/1.5.0/docs/guide/misc/threadPrimitiveDeprecation.html

Wouldn't killing the JVM process (or yanking the plug) be a better simulation of computer death?

OTHER TIPS

There is no portable method. You might try to call "kill -9" (or your local equivalent) on the whole java process, if you want to suppress the running of finalizers and shutdown hooks.

You won't get any kind of repeatable results out of such a test, but it might be interesting to perform such tests a few thousand times if your program is writing to the file system or a database and might leave inconsistent data structures when being killed.

Or you could... kill the process. (ie, if this is Linux, send a kill -9 signal to the process).

Beware the race issues if you're trying to test something - if you hoping to crash badly - it might only do it once a month if you're particularly unlucky.

What is the point of your test? Java offers no guarantees about what happens on an exit, apart from attempting to run shutdown hooks if the exit is a "clean" one

It sounds akin to trying to test your program's behaviour in the case it goes OutOfMemory; there's nothing you can do about it and no way of telling deterministically what will happen

Is there any reason you can't use Thread.suspend()? It will stop the thread so you can examine the state when the thread is interrupted.

You could also use Thread.stop() although that risks throwing multiple ThreadDeathExceptions. You can wrap it int try/catch/finally blocks, but there are no guarantees.

Thread stop() throws an error in the thread. ThreadDeath

The only way to simulate an application dying mid thread is to call System.exit().

However, this is pretty random so you have to perform the test many times to have any confidence you application behaves correctly no matter where it dies.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top