If a thread wants to interrupt another thread it can call the interrupt() method on the other thread. For example ThreadA wants to interrupt ThreadB. It calls ThreadB.interrupt(). The compiler before calling interrupt() on ThreadB calls checkAccess() to check whether ThreadA has the access to call this method on B. Threads in the same ThreadGroup can call this method.
The schema is something like this: When a thread's interrupt method is called, a) if the thread is sleeping or waiting, it wakes up and the execution moves to catch(InterruptedException) block. If the thread wants, it can return from the run method to end its execution. b) if the thread is blocking on IO, it may not respond to interrupt call. the workaround for this is that let a separate thread handle the Interrupt call, which should then close the Input/Output stream c) if the thread is running, then the IsInterrupted (check with documentation) flag is set to true.The thread can check this flag (and end execution if required). This is as/ my understanding.