Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Java中Thread.interrupt源码分析

Java中Thread.interrupt源码分析

作者头像
KINGYT
发布于 2023-03-15 05:52:32
发布于 2023-03-15 05:52:32
53100
代码可运行
举报
运行总次数:0
代码可运行
本文将从源码角度分析Thread.interrupt的实现机制。OpenJDK版本

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

首先看下Thread.interrupt方法

Java类 java.lang.Thread

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
void Thread::interrupt(Thread* thread) {
  ...
  os::interrupt(thread);
}

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
java中断机制深入分析之Thread源码跟踪
在jdk1.0时代,要终止一个Java线程,可以使用Thread提供的stop()和destroy()等方法,但这些方法在jdk1.4之后就已经不推荐使用了,原因是这些方法会强行关闭当前线程,并解锁当前线程已经持有的所有监视器(互斥锁、共享锁),这会导致被这些监视器保护的数据对象处于不一致的状态,其它线程可以查看到这些不一致状态的数据对象,从而导致各种不可预知的错误。
saintyyu
2021/11/22
8410
java中断机制深入分析之Thread源码跟踪
多线程基础(十一):interrupt深度分析
在前面学习ThreadPoolExecutor的时候,我们知道,当线程池中的线程数量大于核心线程数的时候,或者开启了allowCoreThreadTimeOut参数的时候,那么线程去工作队列获取任务的时候就会适用poll(timeout)方法。一旦工作队列中没有任务的时候,则会适用take方法,这两个方法如果没有数据,都会阻塞。而阻塞之后,则会导致线程池中的线程进入TIME_WAITING或者WAITING状态。那么,如果线程池的核心线程收缩或者其他情况导致需要将线程唤醒,则会调用interrupt方法对线程进行中断。而中断的过程中,需要先获得worker实现的AQS锁。可见中断方法在线程池中的应用至关重要。 实际上关于java的interrupt,在我们涉及多线程的各个环节中都至关重要。今天来对java的中断机制进行深度分析。
冬天里的懒猫
2020/09/21
5830
Thread类源码(2)
jvm.cpp中调用了Thread::interrupt,回到thread.hpp源码的源码:
黑洞代码
2021/01/14
8430
Thread类源码(2)
J.U.C并发包诞生的那些事儿
J.U.C是java包java.util.concurrent的简写,中文简称并发包,是jdk1.5新增用来编写并发相关的基础api。java从事者一定不陌生,同时,流量时代的今天,并发包也成为了高级开发面试时必问的一块内容,本篇内容主要聊聊J.U.C背后的哪些事儿,然后结合LockSupport和Unsafe探秘下并发包更底层的哪些代码,有可能是系列博文的一个开篇
kl博主
2023/11/18
2090
Java中LockSupport.park/unpark源码分析
LockSupport类是java.util.concurrent包中各种锁实现的基础。了解LockSupport的内部机制,对于我们理解concurrent包中的各种锁的实现有很大帮助。
KINGYT
2023/03/15
4650
Java中LockSupport.park/unpark源码分析
Java并发编程基础篇(一)之线程
Java并发编程基础篇(一)之线程
Java架构师必看
2021/04/13
5380
Java并发编程基础篇(一)之线程
面经手册 · 第19篇《Thread.start() ,它是怎么让线程启动的呢?》
作者:小傅哥 博客:https://bugstack.cn ❝沉淀、分享、成长,让自己和他人都能有所收获!? ❞ 目录 一、前言 二、面试题 三、线程启动分析 四、线程启动过程 1. Thread
小傅哥
2020/12/02
2440
Java中Thread.sleep源码分析
由上面的代码我们可以看到,如果在调用sleep之前或在sleep过程中,sleep线程被interrupt了,则该sleep方法会抛出InterruptedException异常。
KINGYT
2023/03/15
9620
Java中Thread.sleep源码分析
jdk1.8 Unsafe类 park和unpark方法解析
  park是Unsafe类里的native方法,LockSupport类通过调用Unsafe类的park和unpark提供了几个操作。Unsafe的park方法如下:
用户4415180
2022/06/23
8550
本文深入探讨虚拟机运行时的java线程启动、停止、睡眠与中断
上节描述了虚拟机中各式各样的线程及其创建过程,其中尤为重要的是JavaThread,它是Java线程java.lang.Thread在JVM层的表示,包含很多重要数据。
愿天堂没有BUG
2022/10/31
5860
本文深入探讨虚拟机运行时的java线程启动、停止、睡眠与中断
了解多线程以及如何进行并发编程?
硬件层面软件层面并发和并行JAVA中的线程线程的基础源码分析线程的启动线程的中断异步并发异步 Future异步Callback异步编排 CompletableFuture小结更多
架构探险之道
2020/07/07
8150
了解多线程以及如何进行并发编程?
LockSupport 工具类使用以及实现原理
JDK中的rt.jar包里面的是个LockSupport是个工具类,它的主要作用是挂起和唤醒线程,该工具类是创建锁和其他同步类的基础。
YanL
2020/04/29
2.2K0
LockSupport 工具类使用以及实现原理
形形色色的锁2
synchronized关键字提供了一套非常完整的java内置锁实现,简单易用通过块语句控制锁的范围,而且性能不低,隐藏了偏向锁,轻量、重量锁等复杂的概念,对程序员非常友好。
wiizhang
2018/09/11
1.6K0
形形色色的锁2
LockSupport中的park与unpark原理
LockSupport是用来创建locks的基本线程阻塞基元,比如AQS中实现线程挂起的方法,就是park,对应唤醒就是unpark。JDK中有使用的如下
爬蜥
2019/07/09
2.3K0
教小师妹学多线程,一个有深度的例子!
对于在校学习期间的计算机、软件工程的学生来说,只要学到 Java 多线程,就开始犯迷糊了!
小傅哥
2021/03/26
4560
教小师妹学多线程,一个有深度的例子!
Thread.yield、Thread.sleep、Object.wait、 LockSupport.park 对比
这里就比较清晰了,首先调用当前任务(线程)对应调度类的yield_task()函数,然后调用schedule()函数执行一次重新调度,相当于为当前CPU选择下一个要执行的任务。对于普通线程来说,对应的调度队列是cfs_rq,对应的调度类是cfs_sched_class,对应的yield_task()函数是yield_task_fair()
王小明_HIT
2020/06/16
1.4K0
Thread.yield、Thread.sleep、Object.wait、 LockSupport.park  对比
Unsafe类park和unpark方法源码深入分析(mutex+cond)
说明:本篇博客整理自文末的多篇参考博客(每篇博客各有侧重)。本文结合源码对Unsafe的park和unpark方法进行了完整全面的梳理,并对部分参考博客中存在的错误描述进行说明。
saintyyu
2021/11/22
5280
Unsafe类park和unpark方法源码深入分析(mutex+cond)
Java 并发编程(一) → LockSupport 详解
  不对呀,我女朋友都没有,哪里的儿子?猛的被惊醒,大白天的,我特么竟然还做上了白日梦!
青石路
2021/05/18
5790
Java 并发编程(一) → LockSupport 详解
带你深入了解Java线程中的那些事
引言 说到Thread大家都很熟悉,我们平常写并发代码的时候都会接触到,那么我们来看看下面这段代码是如何初始化以及执行的呢? public class ThreadDemo {
Java架构
2018/05/04
9210
线程的实现与分析
线程是操作系统调度的最小单位,实现线程有三种方式,而 Java Thread 采用的是 内核线程实现
itliusir
2020/01/15
3540
相关推荐
java中断机制深入分析之Thread源码跟踪
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档