软件构造:多线程中interrupted和isinterrupted区别及sleep时的线程中断

本文探讨了在多线程编程中,如何中断一个线程以及interrupted()和isinterrupted()的区别。interrupted()是静态方法,返回当前线程的中断状态并清除标志,而isinterrupted()是非静态的,用于检查目标线程的中断状态。在sleep()方法中,如果检测到中断标志,会抛出InterruptedException。一个示例展示了如何利用isInterrupted()在循环中检测线程中断,避免中断标志被重置。
摘要由CSDN通过智能技术生成

在多线程中若想中断一个线程T,则需要在其他线程中调T.interrupt()方法。然而这样并不会让线程直接结束,在T线程中我们还需要有判断T是否被中止的代码,其中就有两种返回true与false来标明线程是否被中断过的方法interrupted()和isinterrupted()。
简单说一说他们的区别:

  1. interrupted()是static的(是类方法),返回的是当前线程的中断标志;isinterrupted()不是static的(是实例对象方法),返回的是滴具体线程的中断标志。这表明,若我们在另外一个线程T_1中调用T.interrupted()方法,将返回T_1的中断标志,而调用T.isinterrupted()方法将返回T的中断标志
  2. 调用interrupted()判断T是否被中断后会重置T的相应中断标志,而isinterrupted()不会。
    例如以interrupted()判断线程是否中断:

具体例子可以看这个博客

现在我们来说一说sleep()方法如何判断线程中止。按我的理解sleep()方法会不断的判断线程是否被中断过,若检测到中断标志则会抛出异常InterruptedEception

class Task implements Runnable{ 
    private double d = 0.0; 
    public void run() { 
        try{
            while (true) { 
                for (int i = 0; i < 900000; i++) 
                    d = d + (Math.PI + Math.E) / d; 
                Thread.sleep(500); 
                //sleep不断检测中断信号,若有异常则抛出InterruptedException
                }
           } 
        catch(InterruptedException e) {
            return;
        } 
     } 
  }

还有课上的一个例子,这个例子中在main函数中开启一个线程t,在该线程中会执行一个work()方法,该方法处于一个while(true)循环中,不断用isInterrupted()方法检测是否被中断,若被中断则调用sleep()方法,这时sleep就会抛出异常(若用Interrupted()方法,则中断标志会被重置,sleep不会抛出异常)

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值