1 JDK源码跟踪

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

2 OpenJDK源码跟踪

  • jdk源码(JNI注册)
  1. // jdk/src/share/native/java/lang/Thread.c:43
  2. static JNINativeMethod methods[] = {
  3. {"start0", "()V", (void *)&JVM_StartThread},
  4. {"stop0", "(" OBJ ")V", (void *)&JVM_StopThread},
  5. {"isAlive", "()Z", (void *)&JVM_IsThreadAlive},
  6. {"suspend0", "()V", (void *)&JVM_SuspendThread},
  7. {"resume0", "()V", (void *)&JVM_ResumeThread},
  8. {"setPriority0", "(I)V", (void *)&JVM_SetThreadPriority},
  9. {"yield", "()V", (void *)&JVM_Yield},
  10. {"sleep", "(J)V", (void *)&JVM_Sleep},
  11. {"currentThread", "()" THD, (void *)&JVM_CurrentThread},
  12. {"countStackFrames", "()I", (void *)&JVM_CountStackFrames},
  13. {"interrupt0", "()V", (void *)&JVM_Interrupt},
  14. {"isInterrupted", "(Z)Z", (void *)&JVM_IsInterrupted},
  15. {"holdsLock", "(" OBJ ")Z", (void *)&JVM_HoldsLock},
  16. {"getThreads", "()[" THD, (void *)&JVM_GetAllThreads},
  17. {"dumpThreads", "([" THD ")[[" STE, (void *)&JVM_DumpThreads},
  18. {"setNativeName", "(" STR ")V", (void *)&JVM_SetNativeThreadName},
  19. };
  20. // jdk/src/share/javavm/export/jvm.h:254
  21. JNIEXPORT void JNICALL
  22. JVM_Interrupt(JNIEnv *env, jobject thread);
  • java虚拟机(HotSpot实现):
  1. // hotspot/src/share/prims/jvm.cpp:3289
  2. JVM_ENTRY(void, JVM_Interrupt(JNIEnv* env, jobject jthread))
  3. JVMWrapper("JVM_Interrupt");
  4. // Ensure that the C++ Thread and OSThread structures aren't freed before we operate
  5. oop java_thread = JNIHandles::resolve_non_null(jthread);
  6. MutexLockerEx ml(thread->threadObj() == java_thread ? NULL : Threads_lock);
  7. // We need to re-resolve the java_thread, since a GC might have happened during the
  8. // acquire of the lock
  9. JavaThread* thr = java_lang_Thread::thread(JNIHandles::resolve_non_null(jthread));
  10. if (thr != NULL) {
  11. Thread::interrupt(thr);
  12. }
  13. JVM_END
  14. // hotspot/src/share/vm/runtime/thraed.cpp:634
  15. ParkEvent * _ParkEvent ; // for synchronized()
  16. ParkEvent * _SleepEvent ; // for Thread.sleep
  17. ParkEvent * _MutexEvent ; // for native internal Mutex/Monitor,互斥锁
  18. ParkEvent * _MuxEvent ; // for low-level muxAcquire-muxRelease,共享锁
  19. // hotspot/src/share/vm/runtime/thraed.cpp:804
  20. void Thread::interrupt(Thread* thread) {
  21. trace("interrupt", thread);
  22. debug_only(check_for_dangling_thread_pointer(thread);)
  23. os::interrupt(thread);
  24. }
  25. // hotspot/src/hotspot/os/linux/vm/os_linux.cpp:4192
  26. void os::interrupt(Thread* thread) {
  27. assert(Thread::current() == thread || Threads_lock->owned_by_self(),
  28. "possibility of dangling Thread pointer");
  29. OSThread* osthread = thread->osthread();
  30. if (!osthread->interrupted()) {
  31. osthread->set_interrupted(true);
  32. // More than one thread can get here with the same value of osthread,
  33. // resulting in multiple notifications. We do, however, want the store
  34. // to interrupted() to be visible to other threads before we execute unpark().
  35. OrderAccess::fence();
  36. ParkEvent * const slp = thread->_SleepEvent ;
  37. // Thread.sleep方法继续运行
  38. if (slp != NULL) slp->unpark() ;
  39. }
  40. // For JSR166. Unpark event if interrupt status already was set
  41. if (thread->is_Java_thread())
  42. ((JavaThread*)thread)->parker()->unpark();
  43. ParkEvent * ev = thread->_ParkEvent ;
  44. if (ev != NULL) ev->unpark() ;
  45. }
  46. // hotspot/src/share/vm/runtime/osThread.hpp:很短自己看
  47. volatile jint _interrupted; // Thread.isInterrupted state
  48. volatile bool interrupted() const{
  49. return _interrupted != 0;
  50. }
  51. void set_interrupted(bool z){
  52. _interrupted = z ? 1 : 0;
  53. }

Thread.interrupt()源码跟踪的更多相关文章

  1. Thread类源码剖析

    目录 1.引子 2.JVM线程状态 3.Thread常用方法 4.拓展点 一.引子 说来也有些汗颜,搞了几年java,忽然发现竟然没拜读过java.lang.Thread类源码,这次特地拿出来晒一晒. ...

  2. 1 weekend110的hdfs源码跟踪之打开输入流 + hdfs源码跟踪之打开输入流总结

    3种形式的元数据,fsimage是在磁盘上,meta.data是在内存上, 我们继续,前面呢,断点是打在这一行代码处, FileSystem fs = FileSystem.get(conf); we ...

  3. Java关于ReentrantLock获取锁和释放锁源码跟踪

    通过对ReentrantLock获取锁和释放锁源码跟踪主要想进一步深入学习AQS. 备注:AQS中的waitStatus状态码含义:

  4. Java源码跟踪阅读技巧

    转:https://www.jianshu.com/p/ab865109070c 本文基于Eclipse IDE 1.Quick Type Hierarchy 快速查看类继承体系. 快捷键:Ctrl ...

  5. spring security之 默认登录页源码跟踪

    spring security之 默认登录页源码跟踪 ​ 2021年的最后2个月,立个flag,要把Spring Security和Spring Security OAuth2的应用及主流程源码研究透 ...

  6. spring security 之自定义表单登录源码跟踪

    ​ 上一节我们跟踪了security的默认登录页的源码,可以参考这里:https://www.cnblogs.com/process-h/p/15522267.html 这节我们来看看如何自定义单表认 ...

  7. spring security 认证源码跟踪

    spring security 认证源码跟踪 ​ 在跟踪认证源码之前,我们先根据官网说明一下security的内部原理,主要是依据一系列的filter来实现,大家可以根据https://docs.sp ...

  8. spring security 授权方式(自定义)及源码跟踪

    spring security 授权方式(自定义)及源码跟踪 ​ 这节我们来看看spring security的几种授权方式,及简要的源码跟踪.在初步接触spring security时,为了实现它的 ...

  9. Thread类源码解析

    源码版本:jdk8 其中的部分论证和示例代码:Java_Concurrency 类声明: Thread本身实现了Runnable接口 Runnable:任务,<java编程思想>中表示该命 ...

随机推荐

  1. centos7搭建maven私服

    Linux:CentOS7安装maven私服Nexus https://blog.csdn.net/plei_yue/article/details/78616267 搭建nexus3版的maven私 ...

  2. zz SOLID (面向对象设计)

    SOLID (面向对象设计) 维基百科,自由的百科全书 跳到导航 跳到搜索 在程序设计领域, SOLID(单一功能.开闭原则.里氏替换.接口隔离以及依赖反转)是由罗伯特·C·马丁在21世纪早期[1] ...

  3. 【转载】 180623 Conda install 本地压缩包文件tar.bz2

    原文地址“ https://blog.csdn.net/qq_33039859/article/details/80785535 ----------------------------------- ...

  4. 【转载】 深度学习之卷积神经网络(CNN)详解与代码实现(一)

    原文地址: https://www.cnblogs.com/further-further-further/p/10430073.html ------------------------------ ...

  5. 002-06-RestTemplate-请求示例-form、json、multipart、okhttp3

    一.概述 请求示例集合 服务端:https://github.com/bjlhx15/common-study.git 中的 http-client-webserver 服务端:RequestBody ...

  6. Dart 中常用的数组操作方法总结

    这里总结了一些在 Dart 中常用的数组操作方法,以便查阅. 首先,我们准备两组数据,以方便后面使用: List<Map> students = [ { 'name': 'tom', 'a ...

  7. Cheng MeiChun团队的技术支持

    本网页为Cheng MeiChun团队的技术支持网址,如果在我们开发的游戏中遇到任何问题,欢迎联系我们! QQ:1505478990 邮箱:1505478990@qq.com

  8. new (std::nothrow) 与 new

    普通new一个异常的类型std::bad_alloc.这个是标准适应性态. 在早期C++的舞台上,这个性态和现在的非常不同:new将返回0来指出一个失败,和malloc()非常相似. 在内存不足时,n ...

  9. 【计算机视觉】OpenCV篇(9) - 轮廓(寻找/绘制轮廓)

    什么是轮廓? 轮廓是一系列相连的点组成的曲线,代表了物体的基本外形. 轮廓与边缘好像挺像的? 是的,确实挺像,那么区别是什么呢?简而言之,轮廓是连续的,而边缘并不全都连续(见下图示例).其实边缘主要是 ...

  10. hdu 2018 母牛的故事 动态规划入门题

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2018 设 f[i][j] 表示第i天年龄为j的母牛个数,其中j=4代表所有年龄达到4岁的成年母牛,则: ...