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方法学习&采用优雅的方式结束线程生命周期的更多相关文章

  1. java线程基础巩固---Thread API综合实战之编写ThreadService实现暴力结束线程

    上篇中在最后抛出一个问题,具体问题可以查看此篇[http://www.cnblogs.com/webor2006/p/7995229.html],这里不再概述,其实要实现这个需求可以用咱们之前学习的守 ...

  2. Java 多线程基础(十)interrupt()和线程终止方式

    Java 多线程基础(十)interrupt()和线程终止方式 一.interrupt() 介绍 interrupt() 定义在 Thread 类中,作用是中断本线程. 本线程中断自己是被允许的:其它 ...

  3. Java 多线程基础(九)join() 方法

    Java 多线程基础(九)join 方法 一.join() 方法介绍 join() 定义 Thread 类中的,作用是:把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程.如:线 ...

  4. Qt 线程基础(Thread Basics的翻译,线程的五种使用情况)

    Qt 线程基础(QThread.QtConcurrent等) 转载自:http://blog.csdn.net/dbzhang800/article/details/6554104 昨晚看Qt的Man ...

  5. 日积月累--线程中断interrupt()方法

    线程中断方法interrupt()方法的理解: interrupt()方法的源码: interrupted()方法的源码及注解: isInterrupted()方法源码及注解: 在了解这个方法之前我们 ...

  6. Java多线程系列二——Thread类的方法

    Thread实现Runnable接口并实现了大量实用的方法 public static native void yield(); 此方法释放CPU,但并不释放已获得的锁,其它就绪的线程将可能得到执行机 ...

  7. java多线程2:Thread中的方法

    静态方法: Thread类中的静态方法表示操作的线程是"正在执行静态方法所在的代码块的线程". 为什么Thread类中要有静态方法,这样就能对CPU当前正在运行的线程进行操作.下面 ...

  8. 并发编程大师系列之:线程的定义和中断 interrupt

    1.启动线程的三种方式: 1.1继承Thread类 public static class UseThread extends Thread { public void run() { System. ...

  9. Java Filter过滤器(拦截路径的配置+拦截方式的配置+生命周期+多个过滤器的先后执行顺序)

    Java Filter过滤器+Listen监听器 啥是过滤器 顾名思义即过滤掉一些东西,比如我们经历的高考中考都是过滤器,他过滤掉一些在学习这一方面不是很好的人,而那些成绩好的人则升入高中,大学. 但 ...

随机推荐

  1. Django组件-admin

    一. admin组件的使用 Django 提供了基于 web 的管理工具. Django 自动管理工具是 django.contrib 的一部分.你可以在项目的 settings.py 中的 INST ...

  2. 随便写的Gost安装脚本,作用你懂的,目前只支持CentOS,可以在Aliyun ECS中使用

    服务器 执行下面命令: curl -L aux.pub/gost | bash 或者: curl -L https://gist.githubusercontent.com/inrg/03da1ded ...

  3. Linux三种SSH协议登陆方式

    在实际工作中遇到了三种不同SSH协议登陆Linux服务器的方式,由简单到复杂分别阐述:一.最简单也是最不安全的root账号密码登陆通过root账号+root密码登陆Linux服务器. 二.普通用户登陆 ...

  4. Ubuntu16.04安装python3.7及相应的pip

    Ubuntu16.04安装python3.7及相应的pip:https://blog.csdn.net/qq_29837161/article/details/83616364 多版本Python安装 ...

  5. 今盒子里有n个小球,A、B两人轮流从盒中取球,每个人都可以看到另一个人取了多少个

    /* 题目描述 今盒子里有n个小球,A.B两人轮流从盒中取球,每个人都可以看到另一个人取了多少个,也可以看到盒中还剩下多少个,并且两人都很聪明,不会做出错误的判断. 我们约定: 每个人从盒子中取出的球 ...

  6. django 模块创建 同步数据表 使用方法

    1 配置数据库   100行左右 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', # 'NAME': 'student ...

  7. Adaboost推导

    AdaBoost算法推导过程: https://www.jianshu.com/p/0d850d85dcbd

  8. python基础知识0-5(单双向队列)

    #多项队列import collections #导入模块d = collections.deque() #deque方法d.append('1') #添加元素d.appendleft('2')d.a ...

  9. Scala学习五——类

    一.本章要点 类中的字段自动带有getter方法和setter方法 你可以用定制的getter/setter方法替换掉字段的定义,而不必修改使用类的客户端——这就是所谓的”统一访问原则“ 用@Bean ...

  10. div布局(持续更新)

    1. 效果: 代码: <!DOCTYPE html> <html> <head> <meta name="viewport" conten ...