总结一下interrupt,interrupted isInterrupted的区别

interrupt()的作用是中断本线程。
本线程中断自己是被允许的;其它线程调用本线程的interrupt()方法时,会通过checkAccess()检查权限。这有可能抛出SecurityException异常。
如果本线程是处于阻塞状态:调用线程的wait(), wait(long)或wait(long, int)会让它进入等待(阻塞)状态,或者调用线程的join(), join(long), join(long, int), sleep(long), sleep(long, int)也会让它进入阻塞状态。若线程在阻塞状态时,调用了它的interrupt()方法,那么它的“中断状态”会被清除并且会收到一个InterruptedException异常。例如,线程通过wait()进入阻塞状态,此时通过interrupt()中断该线程;调用interrupt()会立即将线程的中断标记设为“true”,但是由于线程处于阻塞状态,所以该“中断标记”会立即被清除为“false”,同时,会产生一个InterruptedException的异常。
如果线程被阻塞在一个Selector选择器中,那么通过interrupt()中断它时;线程的中断标记会被设置为true,并且它会立即从选择操作中返回。
如果不属于前面所说的情况,那么通过interrupt()中断线程时,它的中断标记会被设置为“true”。
中断一个“已终止的线程”不会产生任何操作。


interrupted()isInterrupted()的区别
interrupted() 和 isInterrupted()都能够用于检测对象的“中断标记”。
区别是,interrupted()除了返回中断标记之外,它还会清除中断标记(即将中断标记设为false);
而isInterrupted()仅仅返回中断标记。


标准的中断写法如下所示(中断阻塞的线程和未阻塞的线程)

终止线程的方式
Thread中的stop()和suspend()方法,由于固有的不安全性,已经建议不再使用!
下面,我先分别讨论线程在“阻塞状态”和“运行状态”的终止方式,然后再总结出一个通用的方式。

1 终止处于“阻塞状态”的线程
通常,我们通过“中断”方式终止处于“阻塞状态”的线程。
当线程由于被调用了sleep(), wait(), join()等方法而进入阻塞状态;若此时调用线程的interrupt()将线程的中断标记设为true。由于处于阻塞状态,中断标记会被清除,同时产生一个InterruptedException异常。将InterruptedException放在适当的为止就能终止线程,形式如下:

@Override
public void run() {
    try {
        while (true) {
            // 执行任务...
        }
    } catch (InterruptedException ie) {  
        // 由于产生InterruptedException异常,退出while(true)循环,线程终止!
    }
}

说明:在while(true)中不断的执行任务,当线程处于阻塞状态时,调用线程的interrupt()产生InterruptedException中断。中断的捕获在while(true)之外,这样就退出了while(true)循环!
注意:对InterruptedException的捕获务一般放在while(true)循环体的外面,这样,在产生异常时就退出了while(true)循环。否则,InterruptedException在while(true)循环体之内,就需要额外的添加退出处理。形式如下:

@Override
public void run() {
    while (true) {
        try {
            // 执行任务...
        } catch (InterruptedException ie) {  
            // InterruptedException在while(true)循环体内。
            // 当线程产生了InterruptedException异常时,while(true)仍能继续运行!需要手动退出
            break;
        }
    }
}

说明:上面的InterruptedException异常的捕获在whle(true)之内。当产生InterruptedException异常时,被catch处理之外,仍然在while(true)循环体内;要退出while(true)循环体,需要额外的执行退出while(true)的操作。

2 终止处于“运行状态”的线程
通常,我们通过“标记”方式终止处于“运行状态”的线程。其中,包括“中断标记”和“额外添加标记”。
(01) 通过“中断标记”终止线程。
形式如下:

@Override
public void run() {
    while (!isInterrupted()) {
        // 执行任务...
    }
}

说明:isInterrupted()是判断线程的中断标记是不是为true。当线程处于运行状态,并且我们需要终止它时;可以调用线程的interrupt()方法,使用线程的中断标记为true,即isInterrupted()会返回true。此时,就会退出while循环。
注意:interrupt()并不会终止处于“运行状态”的线程!它会将线程的中断标记设为true。

(02) 通过“额外添加标记”。
形式如下:

private volatile boolean flag= true;
protected void stopTask() {
    flag = false;
}

@Override
public void run() {
    while (flag) {
        // 执行任务...
    }
}

说明:线程中有一个flag标记,它的默认值是true;并且我们提供stopTask()来设置flag标记。当我们需要终止该线程时,调用该线程的stopTask()方法就可以让线程退出while循环。
注意:将flag定义为volatile类型,是为了保证flag的可见性。即其它线程通过stopTask()修改了flag之后,本线程能看到修改后的flag的值。

综合线程处于“阻塞状态”和“运行状态”的终止方式,比较通用的终止线程的形式如下:

@Override
public void run() {
    try {
        // 1. isInterrupted()保证,只要中断标记为true就终止线程。
        while (!isInterrupted()) {
            // 执行任务...
        }
    } catch (InterruptedException ie) {  
        // 2. InterruptedException异常保证,当InterruptedException异常产生时,线程被终止。
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Java中,当一个线程调用interrupt()方法时,该线程中断状态将被设置为true。因此,线程在执行时检测到中断状态已被设置,可以通过抛出InterruptedException异常来响应中断。通常,这意味着线程正在等待某些条件的满足,例如等待I/O操作完成或等待一个锁被释放。此时,如果线程中断,则抛出InterruptedException异常并停止等待条件的满足。 ### 回答2: 当一个线程处于阻塞状态(如调用了 sleep()、wait()、join() 等方法)时,另一个线程可以通过调用该线程interrupt() 方法来打断它的阻塞过程。Java中的线程中断机制是基于一个“中断标志”来实现的。 当一个线程调用了 interrupt() 方法后,会将线程的“中断标志”设置为 true。但是这并不能直接中断线程的执行,而只是通知线程应该中断它的阻塞状态。被中断线程可以通过调用 Thread 类的 interrupted() 方法来检测自己是否被中断。 当一个被阻塞的线程检测到自己被中断后,可以有两种处理方式: 1. 清除中断标志,并继续执行:线程可以通过调用 Thread 类的静态方法 Thread.interrupted() 来清除中断标志,并继续执行。该方法会返回中断标志的当前状态,并将中断标志重置为 false。 2. 抛出中断异常,结束线程线程在捕获到 InterruptedException 异常时可以选择在适当的时候结束自己的执行,从而结束线程。 在执行过程中,被中断线程无论是自身检测到中断标志还是被动抛出中断异常,都可以根据业务需求进行适当的处理,如进行清理操作、释放资源等。 总结来说,Java中的中断机制是通过设置中断标志来通知线程应该中断其阻塞状态。被中断线程可以通过检测中断标志或捕获中断异常来决定如何处理中断请求。这种机制是一种协作式的中断方式,需要被中断线程自己进行相应的响应和处理。 ### 回答3: Java中的interrupted()方法是Thread类的一个静态方法,它用于检查当前线程是否被中断。简单来说,当一个线程调用interrupt()方法时,它会设置线程中断状态为true,以表示该线程已被中断。 在Java中,线程中断状态可以通过调用Thread类的isInterrupted()方法进行检查。而interrupted()方法与isInterrupted()方法的区别在于,interrupted()方法会具有清除中断状态的功能。当一个线程调用interrupted()方法时,它会判断当前线程中断状态,并将其清除为false。因此,连续调用interrupted()方法两次将返回相同的结果,而isInterrupted()方法不会清除中断状态。 当一个线程处于阻塞状态(如调用了sleep()、wait()、join()等方法)时,如果其他线程调用它的interrupt()方法来中断它,那么被中断线程将从阻塞状态返回,并抛出一个InterruptedException异常。这是因为Java的线程模型设计中,对于阻塞方法的设计是响应中断请求并抛出InterruptedException异常,以便于编程人员能够在线程中断时进行相应的处理。 需要注意的是,interrupted()方法是一个静态方法,它用于检查当前线程是否被中断。而isInterrupted()方法是一个实例方法,它用于检查调用该方法的线程是否被中断。因此,在线程内部调用interrupted()方法会检查当前线程中断状态,而调用isInterrupted()方法会检查调用该方法的线程中断状态。 综上所述,interrupted()方法用于检查当前线程中断状态,并清除中断状态。当一个线程中断时,阻塞状态的方法将抛出InterruptedException异常,以便于编程人员进行相应的处理。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值