java线程基础巩固---Thread中断Interrupt方法学习&采用优雅的方式结束线程生命周期
Interrupt学习:
在jdk中关于interrupt相关方法有三个,如下:

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

编译运行:

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

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


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

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

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

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


嗯~~确实是管用能让线程停止,但是!!实际中没有这样用的~~纯实验。
接着来解决开篇所提出的疑问:

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

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

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

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

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

这时再运行:

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

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

采用优雅的方式结束线程生命周期:
由于Thread.stop()方法不能用了,而有了上面的打断机制,下面就来探讨下如何优雅的将线程退出。
方式一、用一个标记来控制【实际中经常使用到】

编译运行:

方式二、利用打断机制:

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

编译运行:

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

那对于这种特殊情况如何也能做到及时让线程进行退出呢?这个就留到下次解决~
java线程基础巩固---Thread中断Interrupt方法学习&采用优雅的方式结束线程生命周期的更多相关文章
- java线程基础巩固---Thread API综合实战之编写ThreadService实现暴力结束线程
上篇中在最后抛出一个问题,具体问题可以查看此篇[http://www.cnblogs.com/webor2006/p/7995229.html],这里不再概述,其实要实现这个需求可以用咱们之前学习的守 ...
- Java 多线程基础(十)interrupt()和线程终止方式
Java 多线程基础(十)interrupt()和线程终止方式 一.interrupt() 介绍 interrupt() 定义在 Thread 类中,作用是中断本线程. 本线程中断自己是被允许的:其它 ...
- Java 多线程基础(九)join() 方法
Java 多线程基础(九)join 方法 一.join() 方法介绍 join() 定义 Thread 类中的,作用是:把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程.如:线 ...
- Qt 线程基础(Thread Basics的翻译,线程的五种使用情况)
Qt 线程基础(QThread.QtConcurrent等) 转载自:http://blog.csdn.net/dbzhang800/article/details/6554104 昨晚看Qt的Man ...
- 日积月累--线程中断interrupt()方法
线程中断方法interrupt()方法的理解: interrupt()方法的源码: interrupted()方法的源码及注解: isInterrupted()方法源码及注解: 在了解这个方法之前我们 ...
- Java多线程系列二——Thread类的方法
Thread实现Runnable接口并实现了大量实用的方法 public static native void yield(); 此方法释放CPU,但并不释放已获得的锁,其它就绪的线程将可能得到执行机 ...
- java多线程2:Thread中的方法
静态方法: Thread类中的静态方法表示操作的线程是"正在执行静态方法所在的代码块的线程". 为什么Thread类中要有静态方法,这样就能对CPU当前正在运行的线程进行操作.下面 ...
- 并发编程大师系列之:线程的定义和中断 interrupt
1.启动线程的三种方式: 1.1继承Thread类 public static class UseThread extends Thread { public void run() { System. ...
- Java Filter过滤器(拦截路径的配置+拦截方式的配置+生命周期+多个过滤器的先后执行顺序)
Java Filter过滤器+Listen监听器 啥是过滤器 顾名思义即过滤掉一些东西,比如我们经历的高考中考都是过滤器,他过滤掉一些在学习这一方面不是很好的人,而那些成绩好的人则升入高中,大学. 但 ...
随机推荐
- liunx基本操作命令
1. rm 删除命令 rm -i 文件名-----------询问y/N 删除文件 rm -f 文件名-----------直接删除文件 rm -r 目录 rm 文件名 rm ...
- ARB扩展与标准OpenGL的关系
由于OpenGL的标准更新不是很频繁,因此,当某种技术应用流行起来时,显卡厂商为了支持该技术,会使用自己的扩展来实现该功能.但是不同厂商如果有不同的实现,那么程序编写将会异常繁琐.因此多个厂商共同协商 ...
- LeetCode.1170-比较字符串中最小字符的出现频率(Compare Strings by Frequency of the Smallest Char)
这是小川的第412次更新,第444篇原创 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第263题(顺位题号是1170).在一个非空字符串s上定义一个函数f(s),该函数计算s中最小字 ...
- 部署 --- Docker
Docker学习 介绍 : Docker速度更快.性能更高.操作更易.我们开发的不同的程序APP是需要在操作系统中单独的环境中隔离运行的. 为了能让我们不同的程序可以在隔离的环境中运行:我们可以使用虚 ...
- Java 基础篇之泛型
背景 在没有泛型前,一旦把一个对象丢进集合中,集合就会忘记对象的类型,把所有的对象都当成 Object 类型处理.当程序从集合中取出对象后,就需要进行强制类型转换,这种转换很容易引起 ClassCas ...
- 如何写出优雅耐看的JavaScript代码
参考链接:https://segmentfault.com/a/1190000020444918?utm_medium=hao.caibaojian.com&utm_source=hao.ca ...
- SQL SERVER 数据有CHAR(10),CHAR(13),CHAR(9)隐藏字符
原文:SQL SERVER 数据有CHAR(10),CHAR(13),CHAR(9)隐藏字符 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/Givi ...
- 【LOJ】#3030. 「JOISC 2019 Day1」考试
LOJ#3030. 「JOISC 2019 Day1」考试 看起来求一个奇怪图形(两条和坐标轴平行的线被切掉了一个角)内包括的点个数 too naive! 首先熟练的转化求不被这个图形包含的个数 -- ...
- PAT A1016 Phone Bills (25)
题目描述 A long-distance telephone company charges its customers by the following rules: Making a long-d ...
- centos7搭建NFS服务
服务器端 139.155.90.78 客户端 192.168.198.146 先查看自己的系统有没有安装rpcbind 和nfs-utils rpm -qa nfs-utils rpcbind 若使 ...