When an Thread.interrupt()
is called on some thread, what happens to that thread?
The target thread is "interrupted". Mostly, a flag is set in that thread, which the thread can look at (with Thread.interrupted()
). If the target thread was currently blocked on some I/O or Object.wait()
, then it is awakened with, respectively, an InterruptedIOException
or an InterruptedException
.
Thread interruption is a gentle way to nudge a thread. It is used to give threads a chance to exit cleanly, as opposed to Thread.stop()
, which is more like shooting the thread with an assault rifle.
The Javadoc for that method explains what happens in what situation.
Here is the JDK 1.6 Javadoc:
Interrupts this thread.
Unless the current thread is interrupting itself, which is always permitted, the checkAccess method of this thread is invoked, which may cause a SecurityException to be thrown.
If this thread is blocked in an invocation of the wait(), wait(long), or wait(long, int) methods of the Object class, or of the join(), join(long), join(long, int), sleep(long), or sleep(long, int), methods of this class, then its interrupt status will be cleared and it will receive an InterruptedException.
If this thread is blocked in an I/O operation upon an interruptible channel then the channel will be closed, the thread's interrupt status will be set, and the thread will receive a ClosedByInterruptException.
If this thread is blocked in a Selector then the thread's interrupt status will be set and it will return immediately from the selection operation, possibly with a non-zero value, just as if the selector's wakeup method were invoked.
If none of the previous conditions hold then this thread's interrupt status will be set.
Interrupting a thread that is not alive need not have any effect.
ZeissS is correct, signaling is the cleanest way to do it. you can also catch the interrupt exception and clean up that way.
精彩评论