interrupt(),interrupted,isInterrupted的区别

tech2024-11-27  8

interrupt()

interrupt() 方法用于中断线程,调用该方法后,线程将被设置“中断”状态。这里仅仅是打了一个中断的标记,并不是真正的停止线程,需要用户自己去监视线程的状态并做处理。 如果线程被Object.wait、 Thread.join、 Thread.sleep三种方法阻塞时,如果调用interrupt,那么他们将接受一个中断异常(InterruptedException),从而提早的终结被阻塞的状态。

interrupted

interrupted 是查看当前线程是否被中断,返回中断标志(中断true,否false) ,并且清楚当前的中断状态。

注意,调用interrupted的肯定是当前的线程currentThread(),源码如下举个例子:比如在main线程中调用t1线程的方法t1.interrupted,此时currentThread()仍然是main线程,所以这里查的仍然是main线程的中断标志。源码括号中true,表示清除中断状态,注释大概意思是:是否重置中断标志状态,取决于传入的参数ClearInterrupted public static boolean interrupted() { return currentThread().isInterrupted(true); } /** * Tests if some Thread has been interrupted. The interrupted state * is reset or not based on the value of ClearInterrupted that is * passed. */ // 注释大概意思是,是否重置中断标志状态,取决于传入的参数ClearInterrupted private native boolean isInterrupted(boolean ClearInterrupted);

isInterrupted

isInterrupted 是查看当前线程是否被中断,返回中断标志(中断true,否false),不会清除当前中断状态

注意,isInterrupted,查看的线程状态就是调用对象的线程,比如t1.inInterrupted,查的就是t1线程的状态。源码如下: public boolean isInterrupted() { return isInterrupted(false);// false表示不会清除中断标志 }

下面用一个例子来说明

import static java.lang.Thread.interrupted; public class InterruptTest { public static void main(String[] args) throws InterruptedException { System.out.println("0 interrupted = "+interrupted()); // 测试当前线程(当前线程是指运行interrupted()方法的线程)是否已经中断,且清除中断状态。 这里之前没有中断过,所以是false System.out.println("1 this.isInterrupted() = "+Thread.currentThread().isInterrupted()); // 测试线程(调用该方法的线程)是否已经中断,不清除中断状态。 这里之前没有中断过 false Thread.currentThread().interrupt(); // 中断线程 System.out.println("2 this.isInterrupted() = "+Thread.currentThread().isInterrupted()); // 上面已经中断 所以是true System.out.println("3 interrupted = "+interrupted());// 之前已经中断过 所以运行状态是已中断 true 并且这里会清楚终端标志,复位 System.out.println("4 this.isInterrupted()复位之后 = "+Thread.currentThread().isInterrupted()); // 上面调用了interrupted 所以这里复位了false } }

执行结果

最新回复(0)