Reputation: 12656
The JavaDoc for Thread
says a Thread.interrupt()
interrupts a thread as follows:
- Threads blocked in one of Object's
wait()
methods or one of Thread'sjoin()
orsleep()
methods will be woken up, their interrupt status will be cleared, and they receive anInterruptedException
.- Threads blocked in an I/O operation of an
InterruptibleChannel
will have their interrupt status set and receive anClosedByInterruptException
. Also, the channel will be closed.- Threads blocked in a
Selector
will have their interrupt status set and return immediately. They don't receive an exception in this case.
What if the thread doesn't meet any of the above criteria? Is it killed or does it continue running or what?
Thanks in advance...
Upvotes: 2
Views: 603
Reputation: 14847
Some things to read from JLS
17.2.3. Interruptions
Interruption actions occur upon invocation of Thread.interrupt, as well as methods defined to invoke it in turn, such as ThreadGroup.interrupt.
Let t be the thread invoking u.interrupt, for some thread u, where t and u may be the same. This action causes u's interruption status to be set to true.
Additionally, if there exists some object m whose wait set contains u, then u is removed from m's wait set. This enables u to resume in a wait action, in which case this wait will, after re-locking m's monitor, throw InterruptedException.
Invocations of Thread.isInterrupted can determine a thread's interruption status. The static method Thread.interrupted may be invoked by a thread to observe and clear its own interruption status.
And from Thread.interrupt()
Javadoc
public void interrupt()
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.
Summary:
If a Thread is in wait
, sleep
, join
or something else which put it in a wait state it will just throw the InterruptedException
to notify that some thread wants that he should stop what he is doing and death.
If it's not in one of previous state it will just set a flag (called interrupt status). As you can understand it will do nothing to avoid some errors caused by a early interrupted thread which could lead your objects to be in a inconsistent state (you cannot know what it's doing).
This flag is used by the thread to know if someone asks to him to stop his work, it's up to the programmer to choose if stop the thread or not (you are free to ignore it.)
Important: Methods like wait
, sleep
etc (said above) will clear the flag when throw the exception. It's important if you do something like while(!Thread.isInterrupted())
to remember this.
If you need, you can know the current flag status using isInterrupted
or interrupted
The only differences between the two that interrupted
will reset the flag, while isInterrupted
not.
Another great reading, here.
(p.s i hope to link the right JLS section, i will search more.)
Upvotes: 0
Reputation:
If the interrupted thread does not check Thread.isInterrupted()
and does something about it, then the call to Thread.interrupt()
on an unblocked thread does effectively nothing other than simply setting the flag. It's the thread implementer's job to properly check the Thread's status with Thread.isInterrupted()
and take the appropriate action.
Upvotes: 4