Java并发编程基础-理解中断
章节
- 什么是中断
- 中断线程的方法
- 线程中断状态的判断以及何时被中断的线程所处 isInterrupted() 状态为 false?
1.什么是中断
线程标识位
中断可以理解为线程的一个标识位属性,它标识一个运行中的线程是否被其他线程进行了中断操作。
2.中断线程的方法
其他线程通过调用该线程的 interrupt() 方法对其进行中断操作。 其实就是其他线程对该线程打了个招呼,要求其中断。
3. 线程中断状态的判断
线程通过方法isInterrupted()方法来进行判断是否被中断。
如下两种情况需要注意:
1.如果被中断的线程已经处于终结状态,那么调用该线程对象的 thread.isInterrupted() 返回的仍是 false。
2.在Java API中可以看到,许多抛出 InterruptedException 的方法,(其实线程已经终结了,因为遇到了异常)如Thread.sleep( long mills) 方法)这些方法在抛出InterruptedException 异常之前,JVM会将中断标识位清除,然后抛出InterruptedException,此时调用isInterrupted()仍会返回false。
package org.seckill.Thread; import java.util.concurrent.TimeUnit; public class Interrupted { public static void main(String[] args) throws InterruptedException{ Thread sleepThread = new Thread(new SleepRunner(),"sleepRunner"); sleepThread.setDaemon(true);//支持性线程 Thread busyThread = new Thread(new BusyRunner(),"busyRunner"); busyThread.setDaemon(true); sleepThread.start(); busyThread.start(); TimeUnit.SECONDS.sleep(5); sleepThread.interrupt(); busyThread.interrupt(); System.out.println("sleep Thread interrupted status is:"+sleepThread.isInterrupted()); System.out.println("busy Thread interrupted status is:"+busyThread.isInterrupted()); SleepUnit.second(500); } /** * 沉睡中的线程-静态内部类 */ static class SleepRunner implements Runnable { public void run() { while (true) { SleepUnit.second(10); } } } /** * 不停运行,空耗cpu的线程-静态内部类 */ static class BusyRunner implements Runnable { public void run() { while (true) { } } } /** * 静态内部工具类 */ static class SleepUnit { public static void second(int seconds) { try { TimeUnit.SECONDS.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } } } }
运行结果:
我们可以发现 sleep线程的 isInterrupted 状态为false,其中断标识位被清除了。
busy 线程属于正常中断所以isInterrupted 状态为 true,中断标识位没有被清除。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
C++模版从精通到精神分裂
点击关注异步图书,置顶公众号 每天与你分享IT好书 技术干货 职场知识 by - 赵岩 先做个广告置入,如果喜欢这篇文章,你可以到zhaoyan.website/blog去查看于此类似的C/C++文章。 这是一篇写软件的文章,但是很硬,提前预警一下,女生不要看! 所有写C++的文章,如果没有源代码都是在耍流氓。闲话不说, May the source be with you! 这是一个教科书般经典的例子。介绍C++的继承和多态。 这里唯一需要重点强调的是:对函数LetAnimalTalk和vectorva 来说,我们可以想象他们是客户。[face=黑体]通过继承把变化封装到基类的后面,这样使用基类接口的客户就不需要改动![/face]对客户来说,无论基类后面怎么变化,你都影响不到我。例如,如果现在有一个经理狗加入了项目团队,你的LetAnimalTalk函数是不需要任何改变的。 So far so good! 现在看看引入模版后,发生了什么? 基本的应用场景是这样的。对于animal, 你可以用字符串来表示他的ID, 如果你想developer是不应该享有字符串名字的,那么你也可...
- 下一篇
Java 学习资料
前两次给大家分享了关于 java 环境的搭建,由于个人精力是有限不能及时的跟上读者的步伐。对于有些学习比较快的同学或者已经掌握的同学会感觉教程更新的有点慢,在这里我先提前给大家分享以下我整理的一些学习 java 的网站和不错的实战项目,供大家在其它时间去学习和实战。 一、新手阶段 1、Java 菜鸟教程 地址如下: http://www.runoob.com/java/java-tutorial.html 该教程对新手非常友好,通俗易懂,而且还有动图展示,也适合当作工具来使用。 2、网易云课堂 地址如下: http://study.163.com/category/java 网易云课堂上面有很多免费的视频供我们学习,边看视频边看书会比你一直拿着一本技术书在那里啃有效果的多,而且光看技术书对于大多数人来说就会犯困,这是最头疼的事。如果我们的技术没到位的时候,也很难体会到作者写书遇到的问题和他为什么会这样写以及写这一段的感受。因此,我们前期完全可以借助网络来提高自己的学习效率,快速入门,在通过慢慢的学习和积累,那样以后的学习会越来越顺。 二、动手阶段 1、慕课网 地址如下: ht...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- CentOS7设置SWAP分区,小内存服务器的救世主
- Hadoop3单机部署,实现最简伪集群
- CentOS8安装Docker,最新的服务器搭配容器使用
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题