首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解Thread.interrupt()的用法

理解Thread.interrupt()的用法
EN

Stack Overflow用户
提问于 2013-08-07 09:48:45
回答 6查看 737关注 0票数 2

我正在阅读Oracle中的中断。我想不出下面的部分。它说

如果线程运行很长时间而不调用抛出InterruptedException的方法,怎么办?然后,它必须定期调用Thread.interrupted,如果接收到中断,则返回true。例如:

代码语言:javascript
复制
for (int i = 0; i < inputs.length; i++) {
    heavyCrunch(inputs[i]);
    if (Thread.interrupted()) {
        // We've been interrupted: no more crunching.
        return;
    }
}

我绞尽脑汁想要理解,如果线程运行很长时间而不调用抛出InterruptedException的方法,这意味着什么呢?其次,Thread.interrupted()的用法是什么,它是线程发送中断给自己的一种方式?这个场景的实际用途是什么?谢谢。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2013-08-07 09:56:23

这是一种使线程可用于中断的技术。

Thread.interrupted() :检查当前线程(本身)是否被其他线程中断,并清除中断状态标志。所以它会问自己,当我执行一项重大任务时,是否有人打断了我的工作,而不去听别人的话。

想象一下如果不做那件事会发生什么。

假设heavyCrunch()的一次迭代需要1分钟的时间。因此,n次迭代将花费n分钟。

现在,假设在启动程序之后,您决定退出程序并优雅地终止程序。所以你打断了这个线程,这个线程正在执行这个沉重的任务。但是线程不知道您已经中断了它,因为它没有检查中断状态。因此,在N分钟尚未完成之前,程序不会结束,您将不得不等待漫长的时间。

因此,为了优雅地终止线程,它应该始终检查中断状态,以便在其他人请求中断时作出响应。

票数 5
EN

Stack Overflow用户

发布于 2013-08-07 10:00:05

如果您中断运行此代码的线程

代码语言:javascript
复制
for (int i = 0; i < inputs.length; i++) {
    heavyCrunch(inputs[i]);
}

它只会在线程中设置中断状态,但不会停止它。

如果设置了中断状态(并清除中断状态),Thread.interrupted将通过添加

代码语言:javascript
复制
if (Thread.interrupted()) {
   return;
}

在循环中,使代码可被中断。

票数 3
EN

Stack Overflow用户

发布于 2013-08-07 10:07:12

除了这句话

如果线程运行很长时间而不调用抛出InterruptedException的方法,怎么办?

很不清楚,我想它们的意思是:

通常,如果您有一个线程在while(true)循环中执行一些工作,也就是说,一个线程在很长一段时间内不会终止,那么您可能会在该线程中放置任何抛出InterruptedException的函数(即Thread.sleep()、套接字读取或其他任何东西!)。这样,当您的线程被注意到中断时,其中一个函数将捕获它,并且您将能够退出在线程中所做的事情(线程并不只是神奇地终止自己)。

下面是这个短语想说的话:

如果您不想/必须使用这些函数,怎么办?然后,您应该使用Thread.interrupted()来检查是否应该停止执行线程正在做的事情,就像捕获InterruptedException时一样。

我希望这比医生更清楚..。

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

https://stackoverflow.com/questions/18100130

复制
相关文章

相似问题

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