I really don't like the accepted answer so I thought I'd throw my $0.02 in.
I want the "t" thread to then catch an InterruptedException but Eclipse won't let me put an InterruptedException in saying it's not thrown in the try body. How can I get the InterruptedException to be called? Am I using t.interrupt() wrong?
It is important to realize that t.interrupt()
only sets the interrupted bit in a thread -- it doesn't actually interrupt the thread's processing per se. A thread can be interrupted at any time safely.
To quote from the Thread.interrupt()
javadocs:
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 java.nio.channels.ClosedByInterruptException.
If this thread is blocked in a java.nio.channels.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.
It is important to add that if the thread's interrupt bit has been set and then wait()
(and others) is called, then the wait()
will throw InterruptedException
immediately.
So you can't catch InterruptedExeption
everywhere since only certain methods throw it. If you want to see if a thread has been interrupted (again has the interrupt bit set) then the right thing to do is to test for it directly with the Thread.getCurrentThread().isInterrupted()
. Typically we do something like the following:
while (!Thread.getCurrentThread().isInterrupted()) {
// process stuff
...
try {
// here's an example of a method that throws InterruptedException
Thread.sleep(100);
} catch (InterruptedException e) {
// catching InterruptedException actually clears the interrupt bit
// so it is a good pattern to re-interrupt the thread immediately
Thread.currentThread().interrupt();
// now we decide what to do since we are interrupted
break;
}
}
There are a number of good questions and answers on this topic:
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…