Thread.interrupt()源码跟踪

1 JDK源码跟踪

1// java.lang.Thread 2public void interrupt() { 3 if (this != Thread.currentThread()) 4 checkAccess(); 5 6 synchronized (blockerLock) { 7 Interruptible b = blocker; 8 if (b != null) { 9 interrupt0(); // Just to set the interrupt flag 10 b.interrupt(this); 11 return; 12 } 13 } 14 interrupt0(); 15} 16 17private 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; }

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )