简介

在Java中,interrupt、interrupted和isInterrupted都是与线程中断相关的术语,但它们之间有一些重要的区别。

  1. interrupt:这是一个方法,用于请求中断一个线程。当你调用一个线程的interrupt方法时,该线程的中断状态将被设置为true。这通常意味着该线程应该检查中断状态并采取适当的行动。如果线程正在执行一个长时间运行的操作,它应该定期检查中断状态,并在收到中断请求时停止。

  2. interrupted:这是一个静态方法,用于清除当前线程的中断状态。当你调用Thread.interrupted()方法时,当前线程的中断状态将被清除,并且返回一个布尔值,表示线程是否曾经被中断。

  3. isInterrupted:这是一个实例方法,用于检查线程的中断状态。它返回一个布尔值,表示线程的中断状态。如果线程的中断状态为true,则表示该线程已收到中断请求。

interrupt

interrupt()常用于停止线程,但是单独调用并不会停止线程,需要加入一个判断才能停止线程。下面是源码:

public void interrupt() {
        if (this != Thread.currentThread())
            checkAccess();


        synchronized (blockerLock) {
            Interruptible b = blocker;
            if (b != null) {
                interrupt0();          // Just to set the interrupt flag
                b.interrupt(this);
                return;
            }
        }
        interrupt0();
    }
复制

interrupted和isInterrupted

这两个方法用于判断线程是否停止,

interrupted() 是静态方法,判断当前执行线程是否停止。

isInterrupted()是对象方法,判断该对象是否已经中断;

这两个的区别是:

interrupted具有清除状态的功能,如果两次调用interrupt()方法,则第二次会将中断状态清除,变为false;

而isInterrupt()没有这个功能;

public static boolean interrupted() {
        return currentThread().isInterrupted(true);
    }


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

下面对interrupt()清除状态演示;

public static void main(String[] args){
        Thread.currentThread().interrupt();
        System.out.println("当前线程是否停止,第一次调用结果"+Thread.interrupted());
        System.out.println("当前线程是否停止,第二次调用结果"+Thread.interrupted());
        System.out.println("当前线程是否停止,第三次调用结果"+Thread.interrupted());
        Thread thread=new Thread();
        System.out.println("当前线程是否停止"+thread.isInterrupted());
        System.out.println("当前线程是否停止"+thread.isInterrupted());
    }
结果
当前线程是否停止,第一次调用结果true
当前线程是否停止,第二次调用结果false
当前线程是否停止,第三次调用结果false
当前线程是否停止false
当前线程是否停止false

总结

interrupt方法用于请求中断线程。

interrupted和isInterrupted方法用于检查线程的中断状态。

通常,当你在编写需要处理线程中断的代码时,你会使用这些方法来处理中断请求、检查线程状态以及清除中断状态。