摘要:今天就简单的说说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. 并发编程之 Thread 类过期方法和常用方法

    前言 在 Java 刚诞生时,Thread 类就已经有了很多方法,但这些方法由于一些原因(有一些明显的bug或者设计不合理)有些已经废弃了,但是他们的方法名却是非常的好,真的是浪费.我们在进行并发必编 ...

  3. 一文讲尽Thread类的源码精髓

    摘要:今天,我们就一起来简单看看Thread类的源码. 本文分享自华为云社区<[高并发]Thread类的源码精髓>,作者:冰 河. 前言 最近和一个朋友聊天,他跟我说起了他去XXX公司面试 ...

  4. java中多线程中Runnable接口和Thread类介绍

    java中的线程时通过调用操作系统底层的线程来实现线程的功能的. 先看如下代码,并写出输出结果. // 请问输出结果是什么? public static void main(String[] args ...

  5. Android(java)学习笔记62:继承Thread类创建线程类

    package cn.itcast_02; /* * 该类要重写run()方法,为什么呢? * 不是类中的所有代码都需要被线程执行的. * 而这个时候,为了区分哪些代码能够被线程执行,java提供了T ...

  6. Thread类线程结束会唤醒使用其对象做锁而睡眠的线程

    首先回顾一下我们的基础知识. sleep: 线程睡眠,不会释放锁 wait: 线程等待.释放锁. notity: 唤醒随机一个当前对象等待的线程,并不会释放锁 notityAll: 唤醒所有当前对象等 ...

  7. python 全栈开发,Day42(Thread类的其他方法,同步锁,死锁与递归锁,信号量,事件,条件,定时器,队列,Python标准模块--concurrent.futures)

    昨日内容回顾 线程什么是线程?线程是cpu调度的最小单位进程是资源分配的最小单位 进程和线程是什么关系? 线程是在进程中的 一个执行单位 多进程 本质上开启的这个进程里就有一个线程 多线程 单纯的在当 ...

  8. Android(java)学习笔记2:继承Thread类创建线程类

    1. 继承Thread类 创建线程类: package cn.itcast_02; /* * 该类要重写run()方法,为什么呢? * 不是类中的所有代码都需要被线程执行的. * 而这个时候,为了区分 ...

  9. Android Framework中Thread类

    Thread类是Android为线程操作而做的一个封装.代码在Thread.cpp中,其中还封装了一些与线程同步相关的类. Thread类 Thread类的构造函数中的有一个canCallJava T ...

  10. python全栈开发,Day42(Thread类的其他方法,同步锁,死锁与递归锁,信号量,事件,条件,定时器,队列,Python标准模块--concurrent.futures)

    昨日内容回顾 线程 什么是线程? 线程是cpu调度的最小单位 进程是资源分配的最小单位 进程和线程是什么关系? 线程是在进程中的一个执行单位 多进程 本质上开启的这个进程里就有一个线程 多线程 单纯的 ...

随机推荐

  1. 监控Mysql数据库

    Prometheus(普罗米修斯) 监控Mysql数据库: 这个是基于第一版本环境搭建的,需要部署prometheus: 服务器 IP地址 Prometheus服务器 192.168.1.22 被监控 ...

  2. docker本地仓库-registry

    Docker本地私有仓库实战: docker仓库主要用于存放docker镜像,docker仓库分为公有仓库和私有仓库,基于registry可以搭建本地私有仓库,使用私有仓库的优点如下: 节省网络带宽, ...

  3. KL-Divergence KL散度

    KL散度(KL-divergence) 直观解释:KL 散度是一种衡量两个分布(比如两条线)之间的匹配程度的方法. 需要解决的问题:已知数据太大,逍遥使用较小的信息表示已知数据.用某种已知分布来表示真 ...

  4. RLChina2022-实践课三:强化学习算法

    MDP算法 MDP被定义为一个元组(S,A,P,r,R) S:所有状态集合 A:在环境力里面智能体所作动作的集合 P:状态转移函数P(s'|s,a),智能体在当前s下,执行a之后,转移到是s'的概率 ...

  5. shell脚本之规范与变量

    shell编程规范与变量 名词简述 面向过程语言 按照顺序执行程序 第一件事干什么->第二件事干什么......(C,shell...) 面向对象语言 把程序看成一个整体(java,python ...

  6. JAVA多线程(1)——线程

    1.定义:线程是一个程序里面不同的执行路径   例子1:只有一个执行路径 (一个分支,即主线程)

  7. 聊聊 RocketMQ 消息轨迹

    这篇文章,我们聊一聊 RocketMQ 的消息轨迹设计思路. 查询消息轨迹可作为生产环境中排查问题强有力的数据支持 ,也是研发同学解决线上问题的重要武器之一. 1 基础概念 消息轨迹是指一条消息从生产 ...

  8. IIS和PHP相关权限问题及解决方案_500错误_500.19 - Internal Server Error与401未授权错误_401.3 - Unauthorized

    在IIS添加网站(假设站点为xxx.yyy.com,本例假设IIS版本为7.5或以上),如果采用IIS默认配置,会在创建站点同时创建相应同名的"应用程序池"(也是xxx.yyy.c ...

  9. HanLP — Aho-Corasick DoubleArrayTire 算法 ACDAT - 基于双数组字典树的AC自动机

    双数组字典树能在O(1)(1是模式串长度)时间内高速完成单串匹配,并且内存消耗可控,然而软肋在于多模式匹配.如果要匹配多个模式串,必须先实现前缀查询,然后频繁截取文本后缀才可多匹配.比如 ushers ...

  10. 中龙技术 | HSCSEC CRY + MISC WP

    CRYPTO[HSC-1th] Easy SignIn 5445705857464579517A4A48546A4A455231645457464243566B5579556C7053546C4A4E ...