摘要:今天就简单的说说Thread类的stop()方法和interrupt()方法到底有啥区别。

本文分享自华为云社区《【高并发】又一个朋友面试栽在了Thread类的stop()方法和interrupt()方法上!》,作者: 冰 河。

一个工作了几年的朋友今天打电话和我聊天,说前段时间出去面试,面试官问他做过的项目,他讲起业务来那是头头是道,犹如滔滔江水连绵不绝,可面试官最后问了一个问题:Thread类的stop()方法和interrupt方法有啥区别。这一问不要紧,当场把那个朋友打懵了!结果可想而知。。。

事后,我也是感慨颇多,现在的程序员只知道做些简单的CRUD吗?哎,不多说了,今天就简单的说说Thread类的stop()方法和interrupt()方法到底有啥区别吧!

stop()方法

stop()方法会真的杀死线程。如果线程持有ReentrantLock锁,被stop()的线程并不会自动调用ReentrantLock的unlock()去释放锁,那其他线程就再也没机会获得ReentrantLock锁, 这样其他线程就再也不能执行ReentrantLock锁锁住的代码逻辑。 所以该方法就不建议使用了, 类似的方法还有suspend()和resume()方法, 这两个方法同样也都不建议使用了, 所以这里也就不多介绍了。

interrupt()方法

interrupt()方法仅仅是通知线程,线程有机会执行一些后续操作,同时也可以无视这个通知。被interrupt的线程,有两种方式接收通知:一种是异常, 另一种是主动检测。

通过异常接收通知

当线程A处于WAITING、 TIMED_WAITING状态时, 如果其他线程调用线程A的interrupt()方法,则会使线程A返回到RUNNABLE状态,同时线程A的代码会触发InterruptedException异常。线程转换到WAITING、TIMED_WAITING状态的触发条件,都是调用了类似wait()、join()、sleep()这样的方法, 我们看这些方法的签名时,发现都会throws InterruptedException这个异常。这个异常的触发条件就是:其他线程调用了该线程的interrupt()方法。

当线程A处于RUNNABLE状态时,并且阻塞在java.nio.channels.InterruptibleChannel上时, 如果其他线程调用线程A的interrupt()方法,线程A会触发java.nio.channels.ClosedByInterruptException这个异常;当阻塞在java.nio.channels.Selector上
时,如果其他线程调用线程A的interrupt()方法,线程A的java.nio.channels.Selector会立即返回。

主动检测通知

如果线程处于RUNNABLE状态,并且没有阻塞在某个I/O操作上,例如中断计算基因组序列的线程A,此时就得依赖线程A主动检测中断状态了。如果其他线程调用线程A的interrupt()方法, 那么线程A可以通过isInterrupted()方法, 来检测自己是不是被中断了。

点击关注,第一时间了解华为云新鲜技术~

据说有人面试栽在了Thread类的stop()方法和interrupt()方法上相关推荐

  1. 【高并发】又一个朋友面试栽在了Thread类的stop()方法和interrupt()方法上!

    来自:冰河技术 写在前面 新一轮的面试已经过去,可能是疫情的原因吧,很多童鞋纷纷留言说今年的面试题难度又提高了,尤其是对并发编程的知识.我细想了下,也许有那么点疫情的原因吧,但无论面试的套路怎么变,只 ...

  2. python多线程返回值问题重写Thread类的run方法

    python多线程使用 文章目录 python多线程使用 一.案例 二.说明 1.针对第一种是有返回值的 ,可以通过future.result() 去拿到每个线程返回值 2.无返回值问题 3.我们可以 ...

  3. 【高并发】一个工作了7年的朋友去面试竟然被Thread类虐的体无完肤

    前言 最近和一个工作了7年的朋友聊天,他跟我说起了他去XXX公司面试的情况,面试官的一个问题把他打懵了!竟然问他:你经常使用Thread类创建线程,那你看过Thread类的源码吗?Thread类创建线 ...

  4. 为什么 wait/notify/notifyAll 在 Object 类定义而不是 Thread 类?

    作者:Yujiaao 来源:segmentfault.com/a/1190000019962661 一个较难回答的 Java 问题, Java 编程语言又不是你设计的,你如何回答这个问题呢?需要对 J ...

  5. 并发基础篇(六):线程Thread类的start()方法和run()方法

    点个赞,看一看,好习惯!本文 GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了 3 个月总结的一线大厂 Java 面试总结,本 ...

  6. Java多线程详解(深究Thread类)

    嗨喽-小伙伴们我又来了, 上一章咱介绍了线程同步,了解了解决线程安全的基本思想----"队列与锁".在前几章的介绍中,我们时不时地会使用到sleep()这个方法,知道它可以通过使线 ...

  7. JAVA线程之Thread类详解

    Thread类用于操作线程,是所以涉及到线程操作(如并发)的基础.本文将通过源码对Thread类的功能作用进行分析. 一.属性 /* Make sure registerNatives is the ...

  8. Thread类、Runnable接口详解

    前言 Thread类想必都不陌生,第一次学习多线程的时候就一定会接触Thread类.本篇主要从Thread类的定义.使用.注意事项.源码等方面入手,全方位的讲解Thread类. Thread 我们经常 ...

  9. 腾讯架构师理解的并发编程基石——Thread类的工作原理

    1. 开篇词 说到并发编程,可能大家脑海中的第一印象会是 Thread.多线程.JUC.线程池.ThreadLocal 等等内容.确实,并发编程是 Java 编程中不可或缺的一部分,掌握并发编程的核心 ...

最新文章

  1. vim中tab键8空格换4空格
  2. tableau实战系列(四)用条形图或环形图来呈现进度百分比
  3. android 九宫格封装,Android 九宫格的实现方法
  4. 采样算法哪家强?一个针对主流采样算法的比较
  5. mysql五-1:单表查询
  6. 实习、竞赛、论文?关于计算机读研的一些小建议!
  7. jQuery.extend()
  8. rtf文件怎么打开_什么是RTF文件(以及如何打开一个文件)?
  9. 小米硬盘路由器服务器,随手分享攻略 篇九:小米路由器更换10T硬盘 —— 小白教程...
  10. 三个元素的矩阵乘除法
  11. 学习使用php的stripslashe()函数去除反斜杠
  12. WARN: Establishing SSL connection without server‘s identity verification
  13. 深圳市已获取支付牌照公司
  14. Tableau字符串拼接
  15. java给pdf文件加水印
  16. 焊缝标注vlx实用程序_机械制图焊缝标注方法!太全了,收藏了
  17. 周金涛:繁荣的起点并非沸腾的年代,或将在2020年出现首次证券市场大繁荣
  18. 铝电解电容器在电路设计时的使用注意事项
  19. 程序员真实从零开始实操 赚钱渠道之一CPS
  20. DPABI详细使用教材——数据准备、预处理流程、数据分析流程

热门文章

  1. (43)前端工程化总结
  2. vrep中thread scirpt以及simRemoteApi.start()的一点点微小的认识
  3. 卡尔曼滤波的理解、推导和应用
  4. mybatis plus 格式话_作为阿里的面试官,我有话想说
  5. 由任意二叉树的前序遍历序列和中序遍历序列求二叉树的思想方法_算法与数据结构基础 - 二叉树(Binary Tree)...
  6. html5 动态3d箭头,HTML5旋转的3D镐 | 箭头
  7. 报错:此版本的SQL Server Data Tools与此计算机中安装的数据库运行时组件不兼容...
  8. (1)DBA查询:数据库
  9. 2018.4.23 数据结构
  10. CentOS 7 常用命令集合