0

当我们在代码中尝试 Threads.sleep 时,我们必须捕获一个 InterruptedException。这意味着线程无法在我们指定的时间内休眠,对吧?那么我们让休眠的线程如何被中断呢?谁能解释这个概念?

4

5 回答 5

2

如何中断线程?我可以调用Thread.interrupt()

这里

中断是对线程的指示,它应该停止正在做的事情并做其他事情。由程序员决定线程如何响应中断,但线程终止是很常见的。这是本课强调的用法。

值得阅读JavaSpecialists 的这篇文章,以了解如何干净地处理中断。

于 2012-10-11T11:31:51.993 回答
0

正如 Brian Agnew 所说,例外sleep()是对interrupt(). 这里的概念是线程应该提供停止自身的方法;如果它没有处于睡眠状态,它应该不时通过interrupted()或检查中断状态isInterrupted()并做出相应的反应。但是如果线程正在休眠并且我们想取消它的执行,我们将注定:线程只是在休眠,它不会关心寻找interrupted标志。但这就是它的内置行为sleep():如果线程在睡眠结束之前被中断,我们会得到一个 InterruptedException。

于 2012-10-11T12:08:14.433 回答
0

它可能会被警报或其他外部事件中断。

于 2012-10-11T11:33:18.757 回答
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);
    }
}
于 2012-10-11T11:49:20.947 回答
0

Java 并发实践(Peierls、Bloch、Bowbeer、Holmes、Lea)

例如,如果应用程序在此线程处于休眠状态时被关闭。

于 2012-10-11T11:32:03.797 回答