Can an interrupted Java thread really skip a finally clause?

SusanW :

I was checking into the oft repeated rumour that daemon threads on the JVM treat finally blocks in some special way (they don't, ok?), when I read this, from the Oracle Java tutorial:

Note: If the JVM exits while the try or catch code is being executed, then the finally block may not execute. Likewise, if the thread executing the try or catch code is interrupted or killed, the finally block may not execute even though the application as a whole continues.

(Emphasis is mine.) And the bit about interrupted caught my eye!

My belief is that if a thread is in try/catch code and is interrupted, then either we're in (or eventually enter) a state (eg sleep, wait) where we end up throwing an InterruptedException, or we aren't and we drop out normally or abnormally, but in all cases we will hit the finally clause.

What have I missed? Is there really a way for a Thread to be interrupted and then skip a finally, whilst the application continues?

Nathan Hughes :

Since you specifically ask about daemon threads: remember daemon threads go away when the jvm's last nondaemon thread terminates, so in that case a daemon thread can die without having executed finally blocks (or whatever other code it was about to execute, there's nothing special about finally blocks). Don't use a daemon thread for anything that you don't mind being dropped on the floor when the jvm terminates.

Otherwise, interruption doesn't do anything to shortcut finally blocks. The point of interruption is that the interrupted thread is in control and can finish its execution, including closing resources, however it needs to.

The tutorials can be very helpful but they are not authoritative. The wording in this case uses the word interrupted, it seems reasonable in this context to assume it is referring specifically to thread interruption, which is incorrect.

Guess you like

Origin http://10.200.1.11:23101/article/api/json?id=431126&siteId=1