前面的例子通过volatile boolean来让任务终止,那么如果任务阻塞了? 如何终止它?本文来看下,参考think in java 。

线程的状态

1、new:线程创建后的短暂状态,其分配系统资源和执行初始后,调度器会将其分配到Runnable或blocked 状态,要看CPU的时间切片

2、runnable: 就绪状态,这个状态需要根据CPU的时间切片来控制是否对线程运行或阻塞。

3、blocked: 阻塞状态,调度器不给在给它分配CPU time。直到这个线程恢复到运行状态,哪些能使线程阻塞,我们下文再说

4、dead: 死亡状态,线程被终止,比如程序执行完成或者被打断终止,这个状态不会在分配CPU time。

让线程阻塞的方式

子线程进行阻塞,有下面的原因:

1、让任务进行sleep(),在指定的睡眠时间内,线程是阻塞中的

2、线程wait() 被挂起,wait()我们专题和notify()一起学习记录。

3、线程进行I/O 操作,进行阻塞

4、线程调用synchrnoized方法在另一个对象上,这个对象被锁住。

阻塞打断

当使用Executor的时候,对其调用shutdownNow()方法将任务终止,如果你不了解,可以看之前发的文章。这个方法有个问题,就是对所有的任务调用其interrupt()打断,但是如果你指向终止单一的子线程,那么使用execute()方法就不可以了,需要使用submit()方法替换execute()方法,submit()方法返回Future对象,其可以调用cancel()方法,传递true,那么它会在其线程上面调用interrupt()打断。

Sleep 阻塞终止任务

sleep 终止我们之前学习过,今天看使用Future 阻塞单一任务的的例子,程序比较有意思:

输出结果:

程序分析:

1、子线程睡眠100秒,我们要记住sleep的时候是不释放所得,那么这个线程当sleep后,线程就阻塞住了,我们可以通过futer.cancel(true) 对齐调用thread 的interrupt方法,将其终止

2、通过输出,我们可以看到sleep的时候,打断异常能捕获

3、在异常捕获中,打断的状态被设置为false,从"sleepBlocked:false" 可以看出

I/O阻塞终止例子

下面我们看I/O阻塞终止的例子:

输出结果:

程序分析:

1、通过程序我们发现,InputStream.in() 进行阻塞,调用f.cancel(true)希望将其打断,但是通过程序结果我们发现不能成功捕获异常,也就是I/O中断不可达

2、我们后面要学NIO,带channel的,可以打断终止任务,我们后面在看。

synchrnoized阻塞中断

下面我们看synchronized阻塞,通过interrupt能否中断,看下面的代码:

输出结果:

程序分析:

1、当我们模拟2个线程,其中一个占有锁了,另一个线程阻塞着获取锁,对其进行f.cancel(true)发现不能被打断,也就是synchrnoized 阻塞不能被打断

2、使用模拟2个线程是因为,一个线程可以重入synchrnoized方法

3、我们可以使用ReentrantLock对象来代替synchronized,其可以被打断

总结下:

1、sleep 使可以被interrupt的,而synchronized和I/O 不能

2、future.cancel(true) 可以对阻塞的线程进行interrupt,终止单个任务( sleep阻塞打断例子验证)

如何查找历史线程阻塞原因_java并发编程-线程状态,线程阻塞方式,阻塞中的线程如何终止?...相关推荐

  1. java线程本地变量_Java并发编程示例(九):本地线程变量的使用

    这篇文章主要介绍了Java并发编程示例(九):本地线程变量的使用,有时,我们更希望能在线程内单独使用,而不和其他使用同一对象启动的线程共享,Java并发接口提供了一种很清晰的机制来满足此需求,该机制称 ...

  2. java 线程安全的原因_Java并发编程——线程安全性深层原因

    线程安全性深层原因 这里我们将会从计算机硬件和编辑器等方面来详细了解线程安全产生的深层原因. 缓存一致性问题 CPU内存架构 随着CPU的发展,而因为CPU的速度和内存速度不匹配的问题(CPU寄存器的 ...

  3. java 关闭守护线程_Java并发编程之线程生命周期、守护线程、优先级、关闭和join、sleep、yield、interrupt...

    Java并发编程中,其中一个难点是对线程生命周期的理解,和多种线程控制方法.线程沟通方法的灵活运用.这些方法和概念之间彼此联系紧密,共同构成了Java并发编程基石之一. Java线程的生命周期 Jav ...

  4. java并发编程实践_Java并发编程实践如何正确使用Unsafe

    一.前言 Java 并发编程实践中的话: 编写正确的程序并不容易,而编写正常的并发程序就更难了.相比于顺序执行的情况,多线程的线程安全问题是微妙而且出乎意料的,因为在没有进行适当同步的情况下多线程中各 ...

  5. java虚拟机线程调优与底层原理分析_Java并发编程——多线程的底层原理

    " Java代码在编译后会变成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节码,最终需要转化为汇编指令在CPU上执行,Java中所使用的并发机制依赖于JVM的实现和 CPU的 ...

  6. java线程同步的实现_Java并发编程(三) - 实战:线程同步的实现

    synchronized关键字 首先,来看一个多线程竞争临界资源导致的同步不安全问题. package com.example.weishj.mytester.concurrency.sync; /* ...

  7. synchronized原理_Java并发编程 -- synchronized保证线程安全的原理

    线程安全是并发编程中的重要关注点,应该注意到的是,造成线程安全问题的主要诱因有两点,一是存在共享数据(也称临界资源),二是存在多条线程共同操作共享数据.因此为了解决这个问题,我们可能需要这样一个方案, ...

  8. synchronized原理_Java并发编程—synchronized保证线程安全的原理分析

    前言 程安全是并发编程中的重要关注点,应该注意到的是,造成线程安全问题的主要诱因有两点,一是存在共享数据(也称临界资源),二是存在多条线程共同操作共享数据.因此为了解决这个问题,我们可能需要这样一个方 ...

  9. java线程池_Java 并发编程 线程池源码实战

    作者 | 马启航 杏仁后端工程师.「我头发还多,你们呢?」 一.概述 笔者在网上看了好多的关于线程池原理.源码分析相关的文章,但是说实话,没有一篇让我觉得读完之后豁然开朗,完完全全的明白线程池,要么写 ...

最新文章

  1. 停课不停学 阿里云天池免费开放AI实训平台
  2. Servlet笔记1
  3. python现在好找工作吗-推崇Python这么多人,为什么他们找不到工作!
  4. golang中的目录操作
  5. 飞桨端到端开发套件揭秘:四大秘密武器,让你的开发效率直线提升
  6. ubuntu下使用python将ppt转成图片_Ubuntu下使用Python实现游戏制作中的切分图片功能...
  7. C++ 调试配置的项目设置
  8. CSS3过渡效果(CSS3)
  9. uboot环境变量(设置bootargs向linux内核传递正确的参数)
  10. 抓取xen-tools生成的信息
  11. 如何线上推广引流?百度知道实现精准引流
  12. Java 面向接口编程
  13. 搭档之家|立秋·暑去凉来 叶落知秋
  14. java获取outlook 日历,Outlook 日历 API 概述
  15. Centos 上使用mmsh协议听猫扑网络电台 VLC播放器
  16. 北伦敦德比桑切斯为枪手扳平比分
  17. 梯形波c语言程序利用tlc5615,TLC5615 10Bit DA正弦波信号发生器仿真原理图及源程序...
  18. 微信小程序完整精品demo:移动小商城:基于node,包含前后台
  19. HTS Sinsy音源库训练方法
  20. 曼尼托巴大学计算机科学世界排名,2020年曼尼托巴大学QS世界排名

热门文章

  1. Pytorch可视化工具tensorboardX(安装不踩坑)
  2. while循环的习题
  3. 三安光电圈钱凶猛 两年三轮再融资逾百亿
  4. day060 ajax文件上传 json补充
  5. centos6.8下安装pythondjango
  6. 安装 WordPress 时一些常见问题
  7. 1.4. Rosegarden
  8. [再寄小读者之数学篇](2014-11-19 $\sin(x+y)=\sin x\cos y+\cos x\sin y$)
  9. 处理linux 下nbu只能找到一个驱动器
  10. 戴尔PowerEdge-C服务器新成员