技术讨论QQ群:135202158

 

正文

这里详细分析interrupt(),interrupted(),isInterrupted()三个方法

interrupt()

中断这个线程,设置中断标识位

    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();     }

我们来找下如何设置中断标识位的
找到interrupt0()的源码,src/hotspot/share/prims/jvm.cpp

JVM_ENTRY(void, JVM_Interrupt(JNIEnv* env, jobject jthread))   ...   if (is_alive) {     // jthread refers to a live JavaThread.     Thread::interrupt(receiver);   } JVM_END

调用了Thread::interrupt方法
src/hotspot/share/runtime/thread.cpp

void Thread::interrupt(Thread* thread) {   ...   os::interrupt(thread); }

os::interrupt方法,src/hotspot/os/posix/os_posix.cpp

void os::interrupt(Thread* thread) {   ...   OSThread* osthread = thread->osthread();   if (!osthread->interrupted()) {     //设置中断标识位     osthread->set_interrupted(true);     ...   }     ... }

isInterrupted()

测试线程是否被中断,线程的中断状态不会改变

public boolean isInterrupted() {         return isInterrupted(false);     }

查看native isInterrupted(boolean ClearInterrupted)源码,查找方式同上
src/hotspot/os/posix/os_posix.cpp

bool os::is_interrupted(Thread* thread, bool clear_interrupted) {   debug_only(Thread::check_for_dangling_thread_pointer(thread);)    OSThread* osthread = thread->osthread();   // 查看是否被中断   bool interrupted = osthread->interrupted();    // 清除标识位后再设置false   if (interrupted && clear_interrupted) {     osthread->set_interrupted(false);   }    return interrupted; }

Java传递ClearInterrupted为false,对应C++的clear_interrupted

interrupted()

测试线程是否被中断,清除中断标识位

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