详解Thread类 interrupt()、interrupted()、isInterrupted() 方法

详解Thread类 interrupt()、interrupted()、isInterrupted() 方法

interrupt() 方法

interrupt()方法的作用是中断线程(线程不一定是当前线程,而是指调用该方法的Thread实例所代表的线程),但实际上只是给线程设置一个中断标志,线程仍会继续运行

JavaSE官方文档中对interrupt()方法的解释如下;
在这里插入图片描述

interrupt()方法源码如下;

public void interrupt() {
    // 若线程中操作的不是当前线程本身,需要进行安全权限校验
    if (this != Thread.currentThread())
        // 权限不通过会抛出AccessControlException异常
        checkAccess();

    // 给线程设置中断标识
    synchronized (blockerLock) {
        Interruptible b = blocker;
        if (b != null) {
            interrupt0();           // Just to set the interrupt flag
            b.interrupt(this);
            return;
        }
    }
    interrupt0();
}

下面是interrupt()方法的简单使用;

// 此处用的是当前线程对象,interrupt()中断(中断标识)的是调用者thread线程
Thread thread = Thread.currentThread();
// 方法返回值void
thread.interrupt();

interrupted() 方法

interrupted()方法的作用是判断当前线程是否被中断(检查中断标志),返回一个boolean值并清除中断状态,第二次再调用时中断状态已经被清除,将返回false

注意,interrupted()方法是静态方法,应当由Thread类直接调用,判断以及清除的是当前线程中断标识,与调用者无关

JavaSE官方文档中对interrupted()方法的解释如下;
在这里插入图片描述

interrupted()方法源码如下;

public static boolean interrupted() {
    // 清除标识ClearInterrupted默认传了true
    return currentThread().isInterrupted(true);
}

// native方法
private native boolean isInterrupted(boolean ClearInterrupted);

下面是interrupted()方法的简单使用;

boolean interrupted = Thread.interrupted();

isInterrupted() 方法

isInterrupted()方法的作用是只判断线程是否被中断 ,不清除中断状态;且与interrupted()方法相比,isInterrupted()判断的是调用者线程的中断标识,并不仅仅是当前线程;

JavaSE官方文档中对isInterrupted()方法的解释如下;
在这里插入图片描述

isInterrupted()方法源码如下;

// 清除标识ClearInterrupted为false,则只判断中断标识并未清除
public boolean isInterrupted() {
    return isInterrupted(false);
}

// native方法
private native boolean isInterrupted(boolean ClearInterrupted);

下面是isInterrupted()方法的简单使用;

Thread thread = Thread.currentThread();
boolean isInterrupted = thread.isInterrupted();

使用示例

分别测试主线程和自定义线程;

public static void main(String[] args) {
    Thread main = Thread.currentThread();
    // 主线程中断
    main.interrupt();
    boolean mainInterrupted = main.isInterrupted();
    System.out.println("主线程是否中断 " + mainInterrupted);

    new Thread(() -> {
        Thread thread = Thread.currentThread();
        System.out.println("线程开始!thread name : " + thread.getName());
        // 自定义线程中断
        thread.interrupt();
        for (int i = 1; i < 6; i++) {
            // 小于4时,执行isInterrupted,只判断不清除;大于4时,执行interrupted,判断并清除
            boolean interrupted = i < 4 ? thread.isInterrupted() : Thread.interrupted();
            System.out.println("执行到 i = "+ i +", 线程[ "+  thread.getName() +"] 是否中断 " + interrupted);
        }
    }, "自定义线程").start();

    // 分别对主线程调用isInterrupted和interrupted
    mainInterrupted = main.isInterrupted();
    System.out.println("主线程是否中断 " + mainInterrupted);
    mainInterrupted = Thread.interrupted();
    System.out.println("主线程是否中断 " + mainInterrupted);
    mainInterrupted = Thread.interrupted();
    System.out.println("主线程是否中断 " + mainInterrupted);
    mainInterrupted = main.isInterrupted();
    System.out.println("主线程是否中断 " + mainInterrupted);
}

根据下面的结果可以看出;

  1. interrupt()方法并未对线程执行进行了实质性的中断,只是添加了中断标志;
  2. isInterrupted()判断的是调用者线程的中断标志,若中断返回true,否则false,且未对中断标志进行清除;
  3. interrupted()是由Thread调用的静态方法,判断的是当前线程是否被中断,若被中断,则返回true,并且会清除线程的中断标识,再次调用时,就会返回false

执行结果如下所示;
在这里插入图片描述

到此,Thread中的三个interrupt中断相关的方法已经介绍完毕;
那么,今天的你,学会了吗?

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: ThreadJava中用于创建和管理线程的。它提供了一些方法来控制线程的行为。其中一些方法包括: 1. start()方法:用于启动线程并执行run()方法。通过继承Thread并重写run()方法,可以在start()方法被调用时执行自定义的线程代码。 2. run()方法:是线程的主要执行方法。在run()方法中定义了线程要执行的任务。当start()方法被调用时,run()方法会被自动调用。 3. currentThread()方法:是Thread的一个静态方法,用于返回当前正在执行的线程对象。它可以用来获取当前线程的信息,如线程名称等。 4. sleep()方法:用于使线程暂停执行一段时间。可以通过指定休眠时间来控制线程的执行速度。 5. join()方法:用于等待一个线程的结束。当一个线程调用另一个线程的join()方法时,它会暂停自己的执行,直到被调用的线程执行完毕。 6. interrupt()方法:用于中断一个线程的执行。当一个线程调用另一个线程的interrupt()方法时,被调用的线程会收到一个中断信号,可以根据需要做出相应的处理。 以上是Thread的一些常用方法详解。通过使用这些方法,可以实现线程的创建、启动、暂停、等待和中断等功能。 #### 引用[.reference_title] - *1* *3* [JavaThread详解](https://blog.csdn.net/Beyondandzy/article/details/118824388)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Thread 部分常用方法详解](https://blog.csdn.net/weixin_41685207/article/details/108877533)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值