java 线程 interrupted_多线程-Java:Thread.interrupted()和Thread.isInterrupted()在用法上的差异?...

2677946738186650650624周围有很多成语,但问题是要明确检查中断状态。

我的理解是,很少应使用2677946738186650650624(实例方法),主要用于日志记录和调试等。 它仅给出给定线程上标志的快照,此快照可能很快就会过时。

普通的习惯用法是检查2677946738186186650624(静态方法)是否正在编写要在某个特定点取消的任务,该任务由于某个睡眠或阻塞的I / O调用等未调用某些东西而导致该事件不会抛出2677946738186650650625 。 如果看到标志集,则应尽快停止当前计算,提前返回或引发异常(也许things.length)。

例如,如果您的任务看起来像

void process(Things[] things) throws InterruptedException {

for (Thing thing : things) {

thing.twiddle(); // this call throws InterruptedException

}

}

那么您无需执行其他任何操作; 如果有人在您的线程上调用process,则在当前或下一个return调用期间,将抛出things.length并停止您的任务。

但是,如果2677946738186650650不抛出return并且通常不能在中间中断怎么办? 假设每个这样的调用花费100毫秒,但2677946738186650650可能是100毫秒。那么即使有人试图中断它,2677946738186650650627也可能会阻塞10秒钟,这在您的应用程序中可能是不可接受的。 因此,您可以显式检查中断:

void process(Things[] things) {

if (Thread.interrupted()) {

return;

}

for (Thing thing : things) {

thing.twiddle();

}

}

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

当然,如果2677946738186186650624的调用者假设它已完成,那么仅显示2677946738186650650625(如此处所示)会产生误导。 因此,您可能希望使2677946738203427427840返回它已完成处理的事物的数量,或者可能更适合抛出异常:

void process(Things[] things) throws InterruptedException {

if (Thread.interrupted()) {

throw new InterruptedException();

}

for (Thing thing : things) {

thing.twiddle();

}

}

在这种情况下,调用方会收到一个(已检查的)异常,通知他们其他人要求在中间停止处理。 通常,调用方应该只让异常抛出调用堆栈。

如果您无法停止当前任务,但又需要知道确实有停止它的请求,例如减少其他工作,您也可以重新打断自己:

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、付费专栏及课程。

余额充值