Skip to content

jdk thread

wangkaiwu edited this page Apr 1, 2022 · 2 revisions

Thread

isInterrupted

JVM_QUICK_ENTRY(jboolean, JVM_IsInterrupted(JNIEnv* env, jobject jthread, jboolean clear_interrupted))
  JVMWrapper("JVM_IsInterrupted");

  ThreadsListHandle tlh(thread);
  JavaThread* receiver = NULL;
  // 將 jthread 转化为 jvm 的 JavaThread。并返回线程是否活跃
  bool is_alive = tlh.cv_internal_thread_to_JavaThread(jthread, &receiver, NULL);
  if (is_alive) {
    // jthread refers to a live JavaThread.
    return (jboolean) Thread::is_interrupted(receiver, clear_interrupted != 0);
  } else {
      // 不活跃也认为没有被打断
    return JNI_FALSE;
  }
JVM_END
bool Thread::is_interrupted(Thread* thread, bool clear_interrupted) {
    return os::is_interrupted(thread, clear_interrupted);
}
bool os::is_interrupted(Thread* thread, bool clear_interrupted) {
    OSThread* osthread = thread->osthread();
    bool interrupted = osthread->interrupted();
    if (interrupted && clear_interrupted) {
        osthread->set_interrupted(false);
    }
    return interrupted;
}

interrupt0

JVM_ENTRY(void, JVM_Interrupt(JNIEnv* env, jobject jthread))
  JVMWrapper("JVM_Interrupt");

  ThreadsListHandle tlh(thread);
  JavaThread* receiver = NULL;
  bool is_alive = tlh.cv_internal_thread_to_JavaThread(jthread, &receiver, NULL);
  if (is_alive) {
    // jthread refers to a live JavaThread.
    Thread::interrupt(receiver);
  }
JVM_END
void os::interrupt(Thread* thread) {
    OSThread* osthread = thread->osthread();
    if (!osthread->interrupted()) {
        // 如果还没有被打断,则设置为打断
        osthread->set_interrupted(true);
        // 双屏障
        OrderAccess::fence();
        // 先把 _SleepEvent 唤醒
        ParkEvent *const slp = thread->_SleepEvent;
        if (slp != NULL) slp->unpark();
    }
    if (thread->is_Java_thread())
        // 再把 parker 唤醒,也就是 park() 对应的方法
        ((JavaThread *) thread)->parker()->unpark();
    ParkEvent *ev = thread->_ParkEvent;
    // 最后是 _ParkEvent 
    if (ev != NULL) ev->unpark();
}

Clone this wiki locally