Java Thread中的interrupt()方法的解释

本文探讨了Java中线程中断的安全性和推荐做法。Java不建议直接终止线程,而是采用中断机制让线程自己判断是否结束。介绍了interrupt()、isInterrupted()和interrupted()三个API的用法,并通过示例展示了它们在sleep()、wait()和join()方法中的行为。文章强调interrupt()仅用于通知线程中断,实际是否结束由线程本身控制。
摘要由CSDN通过智能技术生成
结束线程的思考

早前java中线程的结束有2种:

1.线程的run()方法执行完毕时,该线程会结束。

2.是线程调用stop方法结束。

后来java认为在线程中去强制结束其他线程是不安全的,因为被结束的线程可能会有某些必要的操作还来不及执行。当然这个解释只是从网上抄过来的,api中说明的Deprecated原因是说stop将导致它解锁所有已锁定的监视器(这是未检查的ThreadDeath异常向上传播堆栈的自然结果),其实每个对象包含了对象头,实例数据和填充数据,对象头中保存了锁的标志位和指向monitor对象的起始地址。这个monitor中包含一个叫Owner的部分,当这个Owner指向某一个线程,就说明该对象被这个线程锁定。当然这么底层的东西我是看《深入Java虚拟机》这本书知道的,再深入的东西我也不知道了,并且这不是java层面的东西,我小菜鸡不懂。

好了,思考完了,咱们来看下java现在的推荐。
java推荐使用中断机制来让被调用的线程自己来判断自己要不要死。如果它还没活够那就继续,如果想死了那就自己走吧。

Interrupt相关API
public void interrupt(){...} 

public boolean isInterrupted() {
    return isInterrupted(false);
}

//该方法是静态方法,一般用于需要被interrupt的线程内部来判断本线程是否被其他线程执行了interrupt()
public static boolean interrupted() {
    return currentThread().isInterrupted(true);
}

这三个api只有interrupted是Thread的静态方法,其他俩都是非静态方法。

interrupt():修改中断标志位,并将调用该方法时程序所处的线程退出阻塞状态,此时会通知到被标记的线程并且调用阻塞处会接受到InterruptedException异常。这里的阻塞比如是调用了sleep,wait,join方法,线程在等待同步锁的过程不属于本阻塞范畴。

isInterrupted():判断调用的线程标志位是否为中断,是返回true,否则返回false。

interrupted:判断当前线程是否为中断标记,如果是则返回true,否则返回false,并且它在每调用一次之后都会清除该标志位,也就是设置为false。

interrupt()的使用一般有2种情况:

1.被interrupt的线程内部没有有阻塞方法

2.被interrupt的线程内部有阻塞方法(例如wait,sleep,join)

当一个线程中没有阻塞,我们可能有时候也需要知道其他线程是否调用了interrupt()想让本线程中断,但是这时候没有阻塞的方法可以接收InterruptedException异常,那我们可以换个思路:通过Thread.interrupted()方法来获取当前本线程的中断标志位的值,并且为了在被调用了interrupt()方法时能更实时的接收到这一信息,往往是开启一个循环来判断,这也是一种常用的使用方法。例如下列代码:

public void main() throws InterruptedException {

    //不阻塞的情况
    Thread thread1 = new Thread(() -> {
        System.out.println("执行" + Thread.currentThread().getName(
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值