首页 技术 正文
技术 2022年11月11日
0 收藏 683 点赞 3,344 浏览 1005 个字

Interrupt学习:

在jdk中关于interrupt相关方法有三个,如下:

java线程基础巩固—Thread中断Interrupt方法学习&采用优雅的方式结束线程生命周期

关于上面的疑问会在稍后进行阐述滴,下面看代码:

java线程基础巩固—Thread中断Interrupt方法学习&采用优雅的方式结束线程生命周期

编译运行:

java线程基础巩固—Thread中断Interrupt方法学习&采用优雅的方式结束线程生命周期

应该说是t线程为啥在被打断之后没有退出,还是在运行状态,这时由于它没有捕获这个中断,在捕获中断之前先看一下官方对于interrupt()的一些说明:

java线程基础巩固—Thread中断Interrupt方法学习&采用优雅的方式结束线程生命周期

那难道在线程中不调用上述的三个方法在线程被中断之后就收不到中断异常了么?下面来试验下:

java线程基础巩固—Thread中断Interrupt方法学习&采用优雅的方式结束线程生命周期

java线程基础巩固—Thread中断Interrupt方法学习&采用优雅的方式结束线程生命周期

可以看到也可以正常的读取到中断的状态,那看一下interrupt()的源码:

java线程基础巩固—Thread中断Interrupt方法学习&采用优雅的方式结束线程生命周期

而jdk中所说的自动捕获中断异常的话则需要调用文中所说的三个方法,所以下面用一下捕获中断异常,首先先调用sleep的方式让线程小睡一会:

java线程基础巩固—Thread中断Interrupt方法学习&采用优雅的方式结束线程生命周期

接着再来试用利用wait()让线程等待,当然这个目前还木有学到,后面会学滴,这里只是了解下在wait()的时候是需要加上锁滴:

java线程基础巩固—Thread中断Interrupt方法学习&采用优雅的方式结束线程生命周期

嗯,同样也捕获到了中断异常,但都没有让t线程退出,那有没有现成的API能让线程主动停止呢?当然有,但是官方不推荐使用,因为会存在问题,但是!!这里以玩的心态试下效果:

java线程基础巩固—Thread中断Interrupt方法学习&采用优雅的方式结束线程生命周期

java线程基础巩固—Thread中断Interrupt方法学习&采用优雅的方式结束线程生命周期

嗯~~确实是管用能让线程停止,但是!!实际中没有这样用的~~纯实验。

接着来解决开篇所提出的疑问:

java线程基础巩固—Thread中断Interrupt方法学习&采用优雅的方式结束线程生命周期

其实是有存在的必要的,下面看代码:

java线程基础巩固—Thread中断Interrupt方法学习&采用优雅的方式结束线程生命周期

这时就只能用这个static的方法来判断啦:

java线程基础巩固—Thread中断Interrupt方法学习&采用优雅的方式结束线程生命周期

而其实它就是获得当前的线程,然后再调用它的isInterrupted()方法,源码如下:

java线程基础巩固—Thread中断Interrupt方法学习&采用优雅的方式结束线程生命周期

最后再来用JDK中提到的join()方法来捕获下中断异常,如下:

java线程基础巩固—Thread中断Interrupt方法学习&采用优雅的方式结束线程生命周期

这时就得分析一下join()线程的情况啦,很显然join()的是main线程,而我们打断的是t线程,那主线程的join()当然就收不到中断异常啦,所以基于这个理论下面来改造代码让咱们的join()能收到异常捕获:

java线程基础巩固—Thread中断Interrupt方法学习&采用优雅的方式结束线程生命周期

这时再运行:

java线程基础巩固—Thread中断Interrupt方法学习&采用优雅的方式结束线程生命周期

其实join()方法的实现也是采用了wait()方式,如下:

java线程基础巩固—Thread中断Interrupt方法学习&采用优雅的方式结束线程生命周期

另外还有一个细节需要注意:

java线程基础巩固—Thread中断Interrupt方法学习&采用优雅的方式结束线程生命周期

采用优雅的方式结束线程生命周期:

由于Thread.stop()方法不能用了,而有了上面的打断机制,下面就来探讨下如何优雅的将线程退出。

方式一、用一个标记来控制【实际中经常使用到】

java线程基础巩固—Thread中断Interrupt方法学习&采用优雅的方式结束线程生命周期

编译运行:

java线程基础巩固—Thread中断Interrupt方法学习&采用优雅的方式结束线程生命周期

方式二、利用打断机制:

java线程基础巩固—Thread中断Interrupt方法学习&采用优雅的方式结束线程生命周期

或者不去捕获异常,而是直接通过状态判断去控制:

java线程基础巩固—Thread中断Interrupt方法学习&采用优雅的方式结束线程生命周期

编译运行:

java线程基础巩固—Thread中断Interrupt方法学习&采用优雅的方式结束线程生命周期

但是思考这样一种情况:假如在线程执行过程中有一个非常耗时的操作,比如说访问网络之类的,那既始有上面两种优雅退出的方案,但是由于被这个方法阻塞住无法立即退出线程,如:

java线程基础巩固—Thread中断Interrupt方法学习&采用优雅的方式结束线程生命周期

那对于这种特殊情况如何也能做到及时让线程进行退出呢?这个就留到下次解决~

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,491
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,907
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,740
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,492
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:8,132
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:5,293