For me, the answer is almost always 3.
Java uses a mutual interrupt model: it seems like a very British approach to me:
I say, old guy, could you stop what you are doing if it’s not too much trouble?
But there is no reason to act in a timely manner (or, indeed, in general) to interrupt. To use a quote from Robin Williams :
Stop! ... or ... I'll say it again!
You can write your code to check interrupts periodically, or not - it would be very dirty and repetitive if you would do it everywhere. But if you do not want to do anything when you are interrupted, you should at least preserve the fact that an interrupt has occurred so that the call code that wants to do something acts accordingly.
There is nothing special about InterruptedException - it is a literally empty subclass of Exception . Usually this is only thrown in the first place if a particular method checks Thread.interrupted() or .isInterrupted() . Thus, I would not worry that calling interrupt() does not immediately cause the thread to stop what it is doing - this is the very nature of cooperative interruption.
To determine why I say “almost always” above: the Java tutorial describes the interrupt in this way:
An interrupt is an indication of a thread that should stop what it is doing and do something else. It is up to the programmer to determine exactly how the thread responds to an interrupt, but very often the thread ends.
I only very, very rarely did anything other than wanting to stop interrupting the flow.
If I wanted the thread to "do something else," I would most likely use the executing service: each of the "things" to be done represents a separate Runnable , so I don’t even know if they are done anyway in the same thread.
Therefore, I usually interrupt the thread and then throw a RuntimeException :
catch (InterruptedException e) { Thread.currentThread().interrupt(); throw new RuntimeException(e); }
Each Runnable simply finishes what it does when it is interrupted; the contractor’s service decided whether to perform another task.
This is mainly only when writing framework level code (e.g. ExecutorService), which I would prefer to continue after interruption.