• Thread.interrupt()源码跟踪


    1 JDK源码跟踪

    // java.lang.Thread
    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();
    }
    
    private native void interrupt0();
    

    2 OpenJDK源码跟踪

    • jdk源码(JNI注册)
    // jdk/src/share/native/java/lang/Thread.c:43
    static JNINativeMethod methods[] = {
        {"start0",           "()V",        (void *)&JVM_StartThread},
        {"stop0",            "(" OBJ ")V", (void *)&JVM_StopThread},
        {"isAlive",          "()Z",        (void *)&JVM_IsThreadAlive},
        {"suspend0",         "()V",        (void *)&JVM_SuspendThread},
        {"resume0",          "()V",        (void *)&JVM_ResumeThread},
        {"setPriority0",     "(I)V",       (void *)&JVM_SetThreadPriority},
        {"yield",            "()V",        (void *)&JVM_Yield},
        {"sleep",            "(J)V",       (void *)&JVM_Sleep},
        {"currentThread",    "()" THD,     (void *)&JVM_CurrentThread},
        {"countStackFrames", "()I",        (void *)&JVM_CountStackFrames},
        {"interrupt0",       "()V",        (void *)&JVM_Interrupt},
        {"isInterrupted",    "(Z)Z",       (void *)&JVM_IsInterrupted},
        {"holdsLock",        "(" OBJ ")Z", (void *)&JVM_HoldsLock},
        {"getThreads",        "()[" THD,   (void *)&JVM_GetAllThreads},
        {"dumpThreads",      "([" THD ")[[" STE, (void *)&JVM_DumpThreads},
        {"setNativeName",    "(" STR ")V", (void *)&JVM_SetNativeThreadName},
    };
    
    // jdk/src/share/javavm/export/jvm.h:254
    JNIEXPORT void JNICALL
    JVM_Interrupt(JNIEnv *env, jobject thread);
    
    • java虚拟机(HotSpot实现):
    // hotspot/src/share/prims/jvm.cpp:3289
    JVM_ENTRY(void, JVM_Interrupt(JNIEnv* env, jobject jthread))
      JVMWrapper("JVM_Interrupt");
    
      // Ensure that the C++ Thread and OSThread structures aren't freed before we operate
      oop java_thread = JNIHandles::resolve_non_null(jthread);
      MutexLockerEx ml(thread->threadObj() == java_thread ? NULL : Threads_lock);
      // We need to re-resolve the java_thread, since a GC might have happened during the
      // acquire of the lock
      JavaThread* thr = java_lang_Thread::thread(JNIHandles::resolve_non_null(jthread));
      if (thr != NULL) {
        Thread::interrupt(thr);
      }
    JVM_END
    
    // hotspot/src/share/vm/runtime/thraed.cpp:634
    ParkEvent * _ParkEvent ;   // for synchronized()
    ParkEvent * _SleepEvent ; // for Thread.sleep
    ParkEvent * _MutexEvent ; // for native internal Mutex/Monitor,互斥锁
    ParkEvent * _MuxEvent ;   // for low-level muxAcquire-muxRelease,共享锁
    
    // hotspot/src/share/vm/runtime/thraed.cpp:804
    void Thread::interrupt(Thread* thread) {
      trace("interrupt", thread);
      debug_only(check_for_dangling_thread_pointer(thread);)
      os::interrupt(thread);
    }
    
    // hotspot/src/hotspot/os/linux/vm/os_linux.cpp:4192
    void os::interrupt(Thread* thread) {
      assert(Thread::current() == thread || Threads_lock->owned_by_self(),
        "possibility of dangling Thread pointer");
    
      OSThread* osthread = thread->osthread();
    
      if (!osthread->interrupted()) {
        osthread->set_interrupted(true);
        // More than one thread can get here with the same value of osthread,
        // resulting in multiple notifications.  We do, however, want the store
        // to interrupted() to be visible to other threads before we execute unpark().
        OrderAccess::fence();
        ParkEvent * const slp = thread->_SleepEvent ;
        // Thread.sleep方法继续运行
        if (slp != NULL) slp->unpark() ;
      }
    
      // For JSR166. Unpark event if interrupt status already was set
      if (thread->is_Java_thread())
        ((JavaThread*)thread)->parker()->unpark();
    
      ParkEvent * ev = thread->_ParkEvent ;
      if (ev != NULL) ev->unpark() ;
    }
    
    // hotspot/src/share/vm/runtime/osThread.hpp:很短自己看
    volatile jint _interrupted; // Thread.isInterrupted state    
    
    volatile bool interrupted() const{ 
        return _interrupted != 0;
    }
    
    void set_interrupted(bool z){ 
        _interrupted = z ? 1 : 0; 
    }
    
  • 相关阅读:
    php extends
    php 冒泡排序
    php base64_encode和base64_decode 编码/解码url
    php use
    php命名空间示范
    php 传一个url抓取此页面所有的链接
    pyspark
    【P1330】 封锁阳光大学
    [p1967] 货车运输
    分治的思想
  • 原文地址:https://www.cnblogs.com/linzhanfly/p/11258496.html
Copyright © 2020-2023  润新知