I would say that the Thread extension was unnecessary, and therefore a Runnable implementation is preferred.
But the important thing is that the code knows that the thread is about to exit. If your code is part of some kind of common callback interface, you may not know how you are using. You can be transferred to a thread pool (indeed, we should probably use pools, not build Thread at inappropriate points in the code). OTOH, usually Runnable is an anonymous inner class, and therefore, at the source level, is part of an inline method that knows what is going on.
So, if the thread is about to exit, resetting the interrupt state in the current thread is pointless because there is nothing to interrupt.
At some point you will want to say that he interrupted enough. Thread pools, for example, may continue to use the thread even after the task has been interrupted, although they may want to save InterruptException for callers who try to complete the task.
Libraries usually do not handle interrupts correctly. IMO, interrupts have no context to make sense. Without them, life will be much simpler, unfortunately, they feel their presence.
source share