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. SpringCloud学习(SPRINGCLOUD微服务实战)一

    SpringCloud学习(SPRINGCLOUD微服务实战) springboot入门 1.配置文件 1.1可以自定义参数并在程序中使用 注解@component @value 例如 若配置文件为a ...

  2. 【AMAD】django-activity-stream

    动机 简介 个人评分 动机 为你的django站点生成活动流(类似facebook feed).用户可以在个人feed页面看到订阅的人的活动流. 简介 django-activity-stream1中 ...

  3. Java学习笔记-反射机制

    Java反射机制实在运行状态时,对于任意一个类,都能够知道这个类的属性和方法,对于任意一个对象,都能够调用他的任意一个属性和方法 获取Class对象的三种方式 Object类中的getClass()方 ...

  4. PHP学习(4)——数组的使用

    1.数组的概念 数组就是一个用来存储一系列变量值的命名区域. 每个数组元素有一个相关的索引(也成为关键字),它可以用来访问元素. PHP允许间隔性地使用数字或字符串作为数组的索引. 2.数字索引数组 ...

  5. mysql --explain+slowlog

    一.EXPALIN 在SQL语句之前加上EXPLAIN关键字就可以获取这条SQL语句执行的计划 那么返回的这些字段是什么呢? 我们先关心一下比较重要的几个字段: 1. select_type 查询类型 ...

  6. 重载(overload)和重写(override)的区别

    方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性. 重载发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同.参数个数不同或者二者都不同)则 ...

  7. 【Python基础】03_Python中的命名和关键字

    1.Python中的关键字: ['False', 'None', 'True', 'and', 'as', 'assert', 'break', 'class', 'continue', 'def', ...

  8. Pytest+allure安装和框架搭建

    接口自动化框架搭建 -- 公司系统自测使用,只跑核心业务流程 编辑中...... 1.安装Pytest pip install -U pytest 1.1Pycharm测试脚本运行 创建project ...

  9. X86逆向6:易语言程序的DIY

    易语言程序在中国的用户量还是很大的,广泛用于外挂的开发,和一些小工具的编写,今天我们就来看下如何给易语言程序DIY,这里是用的易语言演示,当然这门技术也是可以应用到任何一门编译型语言中的,只要掌握合适 ...

  10. Dev-C++的一些使用技巧快捷键

    最近开始用Dev-C++在Window下编程,感觉Dec-C++是一款挺不错的C++编译器.下载地址http://www.duote.com/soft/9830.html .现总结一些使用技巧: 1. ...