java if interrupted_Java:使用Thread.interrupted()和Thread.isInterrupted()之间的区别?...

InterruptedException有很多成语,但问题是显式检查中断状态。

我的理解是isInterrupted (实例方法)应该很less使用 – 主要用于日志logging和debugging等。 它只给出给定线程上的标志的快照,之后很快就会过时。

正常的习惯用法是检查interrupted (静态方法),如果你正在编写一个你想要在某个不被调用的事件时被取消的任务,那么这个任务会因为睡眠或者阻塞I / O调用等而抛出InterruptedException 。 如果看到标志设置,应该尽可能快地停止当前的计算,尽早返回或抛出exception(可能是InterruptedException )。

举个例子,如果你的任务看起来像这样

void process(Things[] things) throws InterruptedException { for (Thing thing : things) { thing.twiddle(); // this call throws InterruptedException } }

那么你不需要做任何事情; 如果有人在你的线程上调用了Thread.interrupt ,在当前或下一个twiddle调用期间,一个InterruptedException将被抛出并停止你的任务。

但是,如果twiddle不抛出InterruptedException并且一般不能在中间中断? 说每个这样的调用需要100ms,但是things.length可能是100.然后,即使有人试图中断它, process也可能被阻塞10秒,这在你的应用程序中可能是不可接受的。 所以你可以明确地检查中断:

void process(Things[] things) { if (Thread.interrupted()) { return; } for (Thing thing : things) { thing.twiddle(); } }

在这里,你可以看到为什么interrupted自动检查和清除标志是重要的:你正在使用它来确认收到的消息,有人礼貌地要求你尽快停止。 (在这种情况下,在请求的大约100ms内)。你也可以看到为什么它必须是一个在当前线程上运行的静态方法:它只有在检查周围代码是否应该停止的情况下才有意义。

当然,如果process的调用者假设它已经完成,那么只要按照这里所示的方式return就会有误导性。 所以你可能想让process返回已完成处理的事情的数量,或者可能更适合抛出exception:

void process(Things[] things) throws InterruptedException { if (Thread.interrupted()) { throw new InterruptedException(); } for (Thing thing : things) { thing.twiddle(); } }

在这种情况下,调用者得到(检查)exception,通知他们有人要求在中间停止处理。 通常调用者应该让exception抛出调用堆栈。

如果您无法停止当前的任务,但是仍然需要知道阻止它的请求,您也可以重新打开自己,例如简化其余的工作:

void process(Things[] things) { boolean twiddleFully = true; if (twiddleFully && Thread.interrupted()) { twiddleFully = false; Thread.currentThread().interrupt(); } for (Thing thing : things) { thing.twiddle(twiddleFully); } }

在这里,我们可以更快地处理剩下的事情,但仍然完成循环,并打开中断标志,以便我们的调用者可以决定处理它。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值