资讯专栏INFORMATION COLUMN

线程的中断 - Interrupts

chenatu / 1607人阅读

摘要:我们通常使用中断去终止线程如何中断线程调用,向线程发送指示。当获取到指示时,这些方法将抛出异常。捕获这个异常,并即可中断线程。

Interrupt ?

An interrupt is an indication to a thread that it should stop what it is doing and do something else.

中断(interupt)是一个指示,指示一个线程停止正在做的事情,并做一些其他的事情。

我们通常使用 中断 去终止线程

如何中断线程 ?

调用 interrupt(),向线程发送 interrupt 指示。

如果一个线程内,频繁的调用一个可以 throw InterruptedException 的方法,在接收到 interrupt 指示时,抛出 InterruptedException 。只需要 catch 该异常,并 return,即可退出 run 方法 —— 即终止了线程。

for (int i = 0; i < importantInfo.length; i++) {
    // Pause for 4 seconds
    try {
        Thread.sleep(4000);
    } catch (InterruptedException e) {
        // We"ve been interrupted: no more messages.
        return;
    }
    // Print a message
    System.out.println(importantInfo[i]);
}

Thread 的很多方法都可以 throw InterruptedException,比如 Thread.sleep 方法。当获取到 interrupt 指示时,这些方法将抛出异常。捕获这个异常,并 return ,即可中断线程。

如果一个线程会运行很长时间,且没有调用任何可以 throw InterruptedException 的方法,怎么办?必须定期运行 Thread.interrupted 方法,当获取 interrupt 指令时返回 true

for (int i = 0; i < inputs.length; i++) {
    heavyCrunch(inputs[i]);
    if (Thread.interrupted()) {
        // We"ve been interrupted: no more crunching.
        return;
    }
}

如果项目比较复杂的话,throw new InterruptedException 更有意义

if (Thread.interrupted()) {
    throw new InterruptedException();
}
中断状态标志 - The Interrupt Status Flag

The interrupt mechanism is implemented using an internal flag known as the interrupt status. Invoking Thread.interrupt sets this flag. When a thread checks for an interrupt by invoking the static method Thread.interrupted, interrupt status is cleared. The non-static isInterrupted method, which is used by one thread to query the interrupt status of another, does not change the interrupt status flag.

interrupt 机制的实现,使用了一个内部的flag,用于标识 interrupt status 。

调用 静态方法 Thread.interrupted(用于检查当前 Thread 是否 interrupt),interrupt status 会被清除。
调用 非静态方法 isInterrupted(用于一个 Thread 查询另一个 Thread 是否 interrupt),不会清除 interrupt status。

参考资料

Interrupts

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/65196.html

相关文章

  • Thread类源码解读(3)——线程中断interrupt

    摘要:现在终止一个线程,基本上只能靠曲线救国式的中断来实现。中断机制的核心在于中断状态和异常中断状态设置一个中断状态清除一个中断状态方法同时会返回线程原来的中断的状态。中断异常中断异常一般是线程被中断后,在一些类型的方法如中抛出。 前言 系列文章目录 线程中断是一个很重要的概念,通常,取消一个任务的执行,最好的,同时也是最合理的方法,就是通过中断。 本篇我们主要还是通过源码分析来看看中断的概...

    fevin 评论0 收藏0
  • FutureTask源码分析

    摘要:从而可以启动和取消异步计算任务查询异步计算任务是否完成和获取异步计算任务的返回结果。原理分析在分析中我们没有看它的父类,其中有一个方法,返回一个,说明该方法可以获取异步任务的返回结果。 FutureTask介绍 FutureTask是一种可取消的异步计算任务。它实现了Future接口,代表了异步任务的返回结果。从而FutureTask可以启动和取消异步计算任务、查询异步计算任务是否完成...

    luqiuwen 评论0 收藏0
  • 记一次PHP并发性能调优实战 -- 性能提升104%

    摘要:这是多处理器系统中,调度器用来分散任务到不同的机制,通常也被称为处理器间中断,。文章编写计划 待完成: 详细介绍用到的各个工具 作者: 万千钧(祝星) 适合阅读人群 文中的调优思路无论是php, java, 还是其他任何语言都是用. 如果你有php使用经验, 那肯定就更好了 业务背景 框架及相应环境 laravel5.7, mysql5.7, redis5, nginx1.15 cento...

    番茄西红柿 评论0 收藏0
  • 记一次PHP并发性能调优实战 -- 性能提升104%

    摘要:这是多处理器系统中,调度器用来分散任务到不同的机制,通常也被称为处理器间中断,。文章编写计划 待完成: 详细介绍用到的各个工具 作者: 万千钧(祝星) 适合阅读人群 文中的调优思路无论是php, java, 还是其他任何语言都是用. 如果你有php使用经验, 那肯定就更好了 业务背景 框架及相应环境 laravel5.7, mysql5.7, redis5, nginx1.15 cento...

    xeblog 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<