当我们在代码中尝试Threads.sleep时,我们必须捕获InterruptedException。这意味着线程在我们指定的时间内无法休眠,对吧?那么我们如何打断睡眠的线程呢?任何人都可以解释这个概念吗?
答案 0 :(得分:2)
如何中断线程?我可以打电话给Thread.interrupt()。
来自here:
中断是一个线程的指示,它应该停止它 正在做并做其他事情。这取决于程序员的决定 线程如何响应中断,但这很常见 为线程终止。这是在此强调的用法 教训。
值得阅读this article from JavaSpecialists以了解如何干净地处理中断。
答案 1 :(得分:0)
Java Concurrency In Practice (Peierls, Bloch, Bowbeer, Holmes, Lea)
例如,如果在此线程处于休眠状态时关闭应用程序。
答案 2 :(得分:0)
可能会被警报或其他外部事件打断。
答案 3 :(得分:0)
如果线程早于给定时间醒来,则发生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);
}
}
答案 4 :(得分:0)
正如Brian Agnew所说,sleep()
中的例外是对interrupt()
的反应。这里的概念是一个线程应该提供阻止自己的方法;如果它没有睡眠,它应该通过interrupted()
或isInterrupted()
不时地检查中断状态并做出相应的反应。但是如果线程处于休眠状态并且我们想要取消它的执行,那么我们将注定失败:线程只是在休眠,它不会在意寻找interrupted
标志。但这就是sleep()
的内置行为:如果线程在睡眠完成之前被中断,我们会得到一个InterruptedException。