我们来看一下 thread.interrupt()方法做了什么事情

这个方法里面,调用了interrupt0(),这个方法在前面分析start方法的时候见过,是一个native方法,这里就不再重复贴代码了,同样,我们找到jvm.cpp文件,找到JVM_Interrupt的定义

这个方法比较简单,直接调用了 Thread::interrupt(thr)这个方法,这个方法的定义在Thread.cpp文件中,代码如下

Thread::interrupt方法调用了os::interrupt方法,这个是调用平台的interrupt方法,这个方法的实现是在 os_*.cpp文件中,其中星号代表的是不同平台,因为jvm是跨平台的,所以对于不同的操作平台,线程的调度方式都是不一样的。我们以os_linux.cpp文件为例

set_interrupted(true)实际上就是调用osThread.hpp中的set_interrupted()方法,在osThread中定义了一个成员属性volatile jint _interrupted;

通过上面的代码分析可以知道,thread.interrupt()方法实际就是设置一个interrupted状态标识为true、并且通过ParkEvent的unpark方法来唤醒线程。

1. 对于synchronized阻塞的线程,被唤醒以后会继续尝试获取锁,如果失败仍然可能被park

2. 在调用ParkEvent的park方法之前,会先判断线程的中断状态,如果为true,会清除当前线程的中断标识

3. Object.wait、Thread.sleep、Thread.join会抛出InterruptedException

这里给大家普及一个知识点,为什么Object.wait、Thread.sleep和Thread.join都会抛出InterruptedException? 你会发现这几个方法有一个共同点,都是属于阻塞的方法

而阻塞方法的释放会取决于一些外部的事件,但是阻塞方法可能因为等不到外部的触发事件而导致无法终止,所以它允许一个线程请求自己来停止它正在做的事情。当一个方法抛出InterruptedException时,它是在告诉调用者如果执行该方法的线程被中断,它会尝试停止正在做的事情并且通过抛出InterruptedException表示提前返回。

所以,这个异常的意思是表示一个阻塞被其他线程中断了。然后,由于线程调用了interrupt()中断方法,那么Object.wait、Thread.sleep等被阻塞的线程被唤醒以后会通过is_interrupted方法判断中断标识的状态变化,如果发现中断标识为true,则先清除中断标识,然后抛出
InterruptedException

需要注意的是,InterruptedException异常的抛出并不意味着线程必须终止,而是提醒当前线程有中断的操作发生,至于接下来怎么处理取决于线程本身,比如

1. 直接捕获异常不做任何处理

2. 将异常往外抛出

3. 停止当前线程,并打印异常信息

为了让大家能够更好的理解上面这段话,我们以Thread.sleep为例直接从jdk的源码中找到中断标识的清除以及异常抛出的方法代码

找到 is_interrupted()方法,linux平台中的实现在os_linux.cpp文件中,代码如下

找到Thread.sleep这个操作在jdk中的源码体现,怎么找?

相信如果前面大家有认真看的话,应该能很快找到,代码在jvm.cpp文件中

注意上面加了中文注释的地方的代码,先判断is_interrupted的状态,然后抛出一个InterruptedException异常。到此为止,我们就已经分析清楚了中断的整个流程。

Java并发编程的基础-线程的终止原理相关推荐

  1. Java并发编程的基础-线程的终止

    线程的启动过程大家都非常熟悉,但是如何终止一个线程呢? 这是面试过程中针对3年左右的人喜欢问到的一个题目. 线程的终止,并不是简单的调用stop命令去.虽然api仍然可以调用,但是和其他的线程控制方法 ...

  2. Java并发编程 synchronized保证线程安全的原理

    文章转载致博客 blog.csdn.net/javazejian/- 自己稍加完善. 线程安全是并发编程中的重要关注点,应该注意到的是,造成线程安全问题的主要诱因有两点,一是存在共享数据(也称临界资源 ...

  3. Java并发编程的基础-线程的生命周期

    Java线程既然能够创建,那么也势必会被销毁,所以线程是存在生命周期的,那么我们接下来从线程的生命周期开始去了解线程. 线程一共有6种状态(NEW.RUNNABLE.BLOCKED.WAITING.T ...

  4. 学习笔记:Java 并发编程①_基础知识入门

    若文章内容或图片失效,请留言反馈. 部分素材来自网络,若不小心影响到您的利益,请联系博主删除. 视频链接:https://www.bilibili.com/video/av81461839 视频下载: ...

  5. Java并发编程实战基础概要

    文章目录 Java并发编程实战基础概要 开篇 多线程问题有啥难点呢? 为啥要学习并发编程? 并发问题的根源是什么? CPU切换线程执导致的原子性问题是如何发生的? 缓存导致的可见性问题是如何发生的? ...

  6. java并发编程实践(2)线程安全性

    [0]README 0.0)本文部分文字描述转自:"java并发编程实战", 旨在学习"java并发编程实践(2)线程安全性" 的相关知识: 0.1)几个术语( ...

  7. Java并发编程包中atomic的实现原理

    转载自   Java并发编程包中atomic的实现原理 这是一篇来自粉丝的投稿,作者[林湾村龙猫]最近在阅读Java源码,这一篇是他关于并发包中atomic类的源码阅读的总结.Hollis做了一点点修 ...

  8. Java并发编程—什么是线程?

    原文作者:way_more 原文地址:Java 多线程常见基础面试题总结,面试必看! 目录 一.什么是线程和进程? 二.简要描述线程与进程的关系 三.FAQ 一.什么是线程和进程? 1.1. 何为进程 ...

  9. java并发编程第一课 线程的创建、停止和状态变更

    开篇词: 由点及面,搭建你的 Java 并发知识网 你好,欢迎学习<Java 并发编程核心 78 讲>,我是讲师星星,一线互联网公司资深研发工程师,参与过集团内多个重点项目的设计与开发. ...

最新文章

  1. oracle表决盘奇数,Oracle 的OCR,表决盘与ASM SPFILE恢复方法
  2. xgboost防止过拟合
  3. linq to sql 多条件组合查询
  4. 解析提高PHP执行效率的50个技巧(转)
  5. 华为鸿蒙会议安排,2020华为HDC日程确定,鸿蒙、HMS以及EMUI 11成最关注点
  6. 关于openstack 专业博主地址.后续更新
  7. 个人总结的新手看房买房注意事项,有遗漏的地方请各位同学帮忙补充
  8. type c 网卡 外接网卡 禁用后 不见 消失 找不到 的解决办法
  9. 电脑没有html怎么办,笔记本电脑里没有无线网络连接的选项怎么办
  10. 微信小程序图片显示模式
  11. STM32-M3(野火)SD卡读写/移植znFAT文件访问系统
  12. 关关难过关关过——编译edm
  13. 公司要收我的毕业证书,这合法吗?——网上答疑(17)
  14. Selenium原理以及Python从零实现
  15. 系统集成项目管理工程师3知识点
  16. linux md5sum 的用法
  17. 杭州UI设培训学校哪家好
  18. AD自动布地孔和不需要阻焊层
  19. 计算机图形学 学习总结
  20. win10网络图标变地球

热门文章

  1. 根据方法名执行方法的例子
  2. Quartz.Net - Lesson 1: 使用Quartz
  3. mysql查看锁表与解锁
  4. DialogFragment 将数据传回Activity的onActivityResult方法
  5. 在同一个Linux上配置多个git账户
  6. TP框架对数据库的基本操作
  7. Memcached Client 使用手册
  8. Oracle PL/SQL 程序设计读书笔记 - 第14章 DML和事务管理
  9. 《JavaScript入门经典(第4版)》上第5章一个实例程序的修正,完善
  10. 转:Flash与.NET的通信(一):XMLConnector的应用