JVAV 对线程中断的理解

线程中断

1、前置知识

在这里插入图片描述

  1. 对于调用 wait() , join() ,sleep() 方法的线程会进入 WAITTING,TIME_WAITING状态,让出CPU执行权,此时如果该线程的interrupt()方法被调用,就会抛出中断异常InterruptedException。可以在catch块中感知。
  2. 对于正在运行的线程如果被调用interrupt()方法,则该线程会被打上一个标记,在线程内部可以通过调用isInterupted() 感知。
  3. 处于BLOCKED状态的线程无法响应中断。

2、自己的理解

问1:为什么会有中断这个机制呢?

中断的意义是为了优雅的停止某个线程,让线程自己感知他被中断了,然后进行一些必要逻辑的处理。如果没有中断,不如调用 Thread.stop() 方法,线程会被无条件结束。很可能导致一些错误。

问2:为什么wait() , join() ,sleep() 已经让出了CPU时间片,还可以感知中断异常呢?

当阻塞的线程的interrupt()方法被调用后,JVM会将该线程的状态转变为可运行状态,然后抛出中断异常。

问3:我们该捕获中断异常还是抛出?

和对待其他异常的原则一样,当我们知道如何处理这个异常的时候就可以捕获,如果当前处理不了就抛出。

问4:竞争不到锁而处于BLOCKED状态的线程能否响应中断?

其一:由于处于BLOCKED状态只能通过异常机制来响应中断,能使线程进入BLOCKED状态的只有synchronized关键字。但是关键字是无法抛出异常的,方法才能抛出异常。
其二:一个线程不可能一直处于BLOCKED状态,不然就是线程饥饿或者线程死锁了,虽然BLOCKED无法响应中断,但是进入运行状态就可以感知到了,所以是没问题的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值