当前位置:网站首页>【多线程】——深入理解线程中断方式(interrupt)
【多线程】——深入理解线程中断方式(interrupt)
2022-07-29 11:51:00 【51CTO】
最近在系统回顾多线程这一部分的内容,对线程中断方式这一部分相比之前有了不同的认识。整理一下,如有理解偏颇之处,还请各位大神不惜赐教。
在看高洪岩《Java多线程编程核心技术》的时候里面讲了很多种停止线程方式,其实仔细回想起来停止线程并没有那么复杂。总体整理下来就三种方式!1、正常退出;2、stop暴力停止(不再推荐使用);3、异常法;
1、正常退出
当线程中run()或者call()按照逻辑流程正常的执行结束了,线程也就自然停止了。
2、stop暴力停止
直接在程序中使用thread.stop(),线程会马上停止,但是可能导致数据不同步,或者资源得不到回收的问题而且stop已经标注为作废方法,所以使用一定要慎重。
3、interrupt()异常法。
小编以前的博客写过《【多线程】——停止线程的三种方式》其中讲的是interrupt()和在沉睡中停止本质上讲这两种方式都是通过异常停止的,而且讲的不是很全面,应该是只要线程处于阻塞状态配合interrupt()都能使线程停止,而且停止的方式都是通过抛异常。
interrupt()方法仅仅是在当前线程中打了一个停止的标识将中断标志修改为true,并没有真正的停止线程。如果在此基础上进入堵塞状态(sleep(),wait(),join()),马上就会抛出一个InterruptedException,且中断标志被清除,重新设置为false,线程退出。所以退出线程的方式不仅仅是sleep()+interrupt()方法,其它的暂停线程的方式都可以。
interrupt简述
interrupt()方法只是改变中断状态,不会中断一个正在运行的线程。需要用户自己去监视线程的状态为并做处理。支持线程中断的方法(也就是线程中断后会抛出interruptedException的方法)就是在监视线程的中断状态,一旦线程的中断状态被置为“中断状态”,就会抛出中断异常。这一方法实际完成的是,给受阻塞的线程发出一个中断信号,这样受阻线程检查到中断标识,就得以退出阻塞的状态。
更确切的说,如果线程被Object.wait, Thread.join和Thread.sleep三种方法之一阻塞,此时调用该线程的interrupt()方法,那么该线程将抛出一个 InterruptedException中断异常(该线程必须事先预备好处理此异常),从而提早地终结被阻塞状态。如果线程没有被阻塞,这时调用 interrupt()将不起作用,直到执行到wait(),sleep(),join()时,才马上会抛出 InterruptedException。
this.interrupted()
测试当前线程是否已经中断(静态方法)。返回的是上一次的中断状态,并且会清除该状态,所以连续调用两次,第一次返回true,第二次返回false。
this.isInterrupted()
测试线程当前是否已经中断,但是不能清除状态标识。
总结
再次总结线程的停止方式,将线程停止方式归纳一下,就三种方式,理解清楚了其实也不是很复杂。
边栏推荐
- Out-of-the-box problem-solving thinking, putting a "rearview mirror" on the unconscious life
- LMO·3rd - 报名通知
- QML(二):设置自定义窗体
- ASN.1接口描述语言详解
- Codeforces Round #797 (Div. 3)个人题解
- 报表查询字段集sql摘记
- 解决 Chrome 浏览器被毒霸篡改问题
- 2022-07-29日报:AlphaFold最新重大进展:完成几乎所有已知的2亿多蛋白质结构预测,完全开放
- [image detection] Research on cumulative weighted edge detection method based on gray image, with matlab code
- 2.3 Insertion sort
猜你喜欢
【一起学Rust | 基础篇】rust函数与流程控制详解
Based article 】 【 learn with Rust | Rust function and process control, rounding
Recursion - Eight Queens Problem
2022年企业直播行业发展洞察
MySql启动、连接sqlog、主从复制、双机热备(开机时)
[image detection] Research on cumulative weighted edge detection method based on gray image, with matlab code
Alluxio为Presto赋能跨云的自助服务能力
飞桨框架体验评测交流会,产品的使用体验由你来决定!
XSS Vulnerability Analysis
[image detection] Research on cumulative weighted edge detection method based on gray image, with matlab code
随机推荐
HMS Core音频编辑服务音源分离与空间音频渲染,助力快速进入3D音频的世界
Dawei gbase8s cursor stability read esql test case
MySQL高级_视图
From scratch Blazor Server (3) - add cookie authorization
2022-07-29日报:AlphaFold最新重大进展:完成几乎所有已知的2亿多蛋白质结构预测,完全开放
DAY 24 daily SQL clock 】 【 丨 weather types in different countries [difficult simple]
【每日SQL打卡】DAY 24丨找到连续区间的开始和结束数字【难度中等】
Why should kubernetes be used in development environments
【每日SQL打卡】DAY 24丨不同国家的天气类型【难度简单】
怎么以管理员身份运行cmd?以管理员身份运行cmd方法介绍
黑马四小时入门学习记录-2|本地应用
Flink UDF 函数汇总
The company has a new product, do you want to hire an agent?
Basic Concepts of Kubernetes
LeetCode_容斥原理_中等_223.矩形面积
公司出了一款新产品,要不要招代理商?
力扣sql刷题(四)
【一起学Rust | 基础篇】Rust基础——变量和数据类型
Deep understanding of c # nullable types
c语言:来实现一个小程序n子棋(已五子棋为例)