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

前面的例子通过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 阻塞单一任务的的例子,程序比较有意思:

1278ad48cd16cef458c67ac836159465.png

输出结果:

1ebce4f38050dfd9e4bc92742963b9ad.png

程序分析:

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

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

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

I/O阻塞终止例子

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

bbd54622a02fbc67877c890519601332.png

输出结果:

9a4d05530d08e2466d6531a8ed6b9f11.png

程序分析:

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

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

synchrnoized阻塞中断

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

85a6bfcc67d3318710fa2e8cf5508fb4.png

输出结果:

7f767752b18afe7d8d494fe46116d82a.png

程序分析:

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

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

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

总结下:

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值