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);
}
}
在这里,我们可以更快地处理其余的事情,但仍然可以完成循环,然后重新打开中断标志,以便我们的调用者可以决定处理它。