当我们在代码中尝试 Threads.sleep 时,我们必须捕获一个 InterruptedException。这意味着线程无法在我们指定的时间内休眠,对吧?那么我们让休眠的线程如何被中断呢?谁能解释这个概念?
5 回答
如何中断线程?我可以调用Thread.interrupt()。
从这里:
中断是对线程的指示,它应该停止正在做的事情并做其他事情。由程序员决定线程如何响应中断,但线程终止是很常见的。这是本课强调的用法。
值得阅读JavaSpecialists 的这篇文章,以了解如何干净地处理中断。
正如 Brian Agnew 所说,例外sleep()
是对interrupt()
. 这里的概念是线程应该提供停止自身的方法;如果它没有处于睡眠状态,它应该不时通过interrupted()
或检查中断状态isInterrupted()
并做出相应的反应。但是如果线程正在休眠并且我们想取消它的执行,我们将注定:线程只是在休眠,它不会关心寻找interrupted
标志。但这就是它的内置行为sleep()
:如果线程在睡眠结束之前被中断,我们会得到一个 InterruptedException。
它可能会被警报或其他外部事件中断。
如果线程早于给定时间唤醒,则会发生 InterruptionException。
抛出 Execption 只是为了给你(线程)一个处理特殊情况的选项。
在最常见的情况下,您不需要捕获此异常。我更喜欢一个小帮手:
public class Sleeper {
private static final Logger log = Logger.getLogger(Sleeper.class);
/**
* @param time
* @param units
* @return milliseconds
*/
public static long sleepUnsafe(final long time, final TimeUnit units) {
final long start = System.currentTimeMillis();
final long millis = TimeUnit.MILLISECONDS.convert(time, units);
try {
Thread.sleep(millis);
} catch (final InterruptedException e) {
final long end = System.currentTimeMillis();
final long timeSlept = end - start;
final long difference = millis - timeSlept;
if (difference > 0) {
Sleeper.log.warn("should sleep for " + time + " " + units + ". But was awaked after " + (end - start) + " ms. Diffence is " + difference
+ "ms.");
return difference;
}
}
return 0;
}
/**
*
* @param millis
* @return
*/
public static long sleepUnsafe(final long millis) {
return Sleeper.sleepUnsafe(millis, TimeUnit.MILLISECONDS);
}
}
Java 并发实践(Peierls、Bloch、Bowbeer、Holmes、Lea)
例如,如果应用程序在此线程处于休眠状态时被关闭。