首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么中断的方式和isInterrupted的行为有区别?

为什么中断的方式和isInterrupted的行为有区别?
EN

Stack Overflow用户
提问于 2018-05-01 13:18:02
回答 2查看 242关注 0票数 4

我刚通过用于中断的Javadoc。我确实了解到线程类的两种方法之间的区别:中断()和isInterrupted()。引用医生的话:

当线程通过调用静态方法Thread.interrupted来检查中断时,中断状态将被清除。一个线程用于查询另一个线程的中断状态的非静态isInterrupted方法不会更改中断状态标志。

我不明白的是,为什么会有这样的行为呢?interrupted是否有理由重置当前线程的状态,而isInterrupted没有重新设置调用的线程的状态?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-05-01 13:37:36

Thread.interrupted只应用于当前线程;它是一个静态方法。

代码语言:javascript
复制
new Thread(() -> {
    while (true) {
        if (Thread.interrupted()) {
            break;
        }
        System.out.println("Running");
    }
});

清除标记很方便,因为执行检查的线程需要对中断作出反应并以某种方式处理它。如果您想再次重置标志,这很简单:只需调用interrupt

isInterrupted不是一种静态方法。它被设计成可能被其他线程调用。

代码语言:javascript
复制
Thread foo = new Thread(/*...*/);
foo.start();

//...

if (foo.isInterrupted()) 
{
   //do something
}

首先,其他线程在概念上不应该告诉foo它不再被中断。foo必须处理中断本身--其他线程不能代表foo处理它。

从实现的角度来看,如果此方法要自动清除标志,则必须使这种检查然后重置为原子,以避免线程foo在重新设置标志之前读取标志。您将不得不以某种方式与线程本身共享这个互斥体。这将使isInterrupted方法的使用变得非常笨拙。

票数 3
EN

Stack Overflow用户

发布于 2018-05-01 13:54:04

当您想检查线程是否已被中断时,请调用thread.isInterrupted()

当您想要检查当前线程是否已被中断时,如果是,您将处理并吞下它,调用Thread.interrupted()

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50117219

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档