public void interrupt() {
        if (this != Thread.currentThread())
            checkAccess();

        synchronized (blockerLock) {
            Interruptible b = blocker;
            if (b != null) {
                interrupt0();           // Just to set the interrupt flag
                b.interrupt(this);
                return;
            }
        }
        interrupt0();
    }

intertupt方法的核心在于interrupt0()方法,这个方法只会将interruptFlag设置为true,虽然设置flag为true了,但是并不会中断当前线程,只有在线程运行能产生InterrupteException的方法时,jvm会自动中断线程并将线程的中断标志位清除,重新设置位false。

 public static boolean interrupted() {
        return currentThread().isInterrupted(true);
    }

interrupted方法主要是获取当前线程currentThread,并通过当前线程调用isInterrupted(true),参数true表示线程调用该方法之后会将中断标志位清零,重新设置为false

 public boolean isInterrupted() {
        return isInterrupted(false);
    }
    private native boolean isInterrupted(boolean ClearInterrupted);

isInterrupted()方法底层时调用的java的本地方法isInterrupted(boolean ClearInterrupted),参数ClearInterrupted默认是false,说明直接调用isInterrupted()是不会重新将标志位置为false,而且isInterrupted()是将调用该方法的对象所在线程的中断标志位设置为fasle
当前线程和调用线程不一定相同,比如当前线程是A,在A中调用线程B对象的isInterrupted()方法


浮生若梦昔贤兴怀
1 声望0 粉丝