前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java中Thread.interrupt源码分析

Java中Thread.interrupt源码分析

作者头像
KINGYT
发布2023-03-15 13:52:32
5000
发布2023-03-15 13:52:32
举报
本文将从源码角度分析Thread.interrupt的实现机制。OpenJDK版本

➜ jdk hg id 76072a077ee1+ jdk-11+28

首先看下Thread.interrupt方法

Java类 java.lang.Thread

代码语言:javascript
复制
public void interrupt() {
    if (this != Thread.currentThread()) {
        checkAccess();


        // thread may be blocked in an I/O operation
        synchronized (blockerLock) {
            Interruptible b = blocker;
            if (b != null) {
                interrupt0();  // set interrupt status
                b.interrupt(this);
                return;
            }
        }
    }


    // set interrupt status
    interrupt0();
}
...
private native void interrupt0();

该方法主要做了两件事,首先是调用interrupt0,转向JVM做进一步的中断处理,其次是调用blocker.interrupt方法,中断blocker的当前操作,比如堵塞的io读写等。

我们这里主要看下interrupt0方法。该方法是native方法,看下对应的JVM内部的代码

文件 src/hotspot/share/prims/jvm.cpp

代码语言:javascript
复制
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

代码语言:javascript
复制
void Thread::interrupt(Thread* thread) {
  ...
  os::interrupt(thread);
}

该方法调用了os::interrupt方法,继续看下这个

文件 src/hotspot/os/posix/os_posix.cpp

代码语言:javascript
复制
void os::interrupt(Thread* thread) {
  ...
  OSThread* osthread = thread->osthread();


  if (!osthread->interrupted()) {
    osthread->set_interrupted(true);
    ...
    ParkEvent * const slp = thread->_SleepEvent ;
    if (slp != NULL) slp->unpark() ;
  }


  // For JSR166. Unpark even if interrupt status already was set
  if (thread->is_Java_thread())
    ((JavaThread*)thread)->parker()->unpark();


  ParkEvent * ev = thread->_ParkEvent ;
  if (ev != NULL) ev->unpark() ;
}

这个方法就是最终的interrupt实现,它会首先设置线程的interrupted状态为true,然后分别调用各种ParkEvent或Parker的unpark方法,使其从阻塞状态返回。

比如,上面的_SleepEvent就是对应Thread.sleep方法,((JavaThread*)thread)->parker()就是对应LockSupport.park方法,_ParkEvent就是对应synchronized同步块及Object.wait方法。

有关ParkEvent或Parker的unpark方法是如何实现的,请看其他文章:

Java中LockSupport.park/unpark源码分析

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-01-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 卯时卯刻 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档