Java Thread.sleep

时间:2012-10-11 11:30:50

标签: java multithreading

当我们在代码中尝试Threads.sleep时,我们必须捕获InterruptedException。这意味着线程在我们指定的时间内无法休眠,对吧?那么我们如何打断睡眠的线程呢?任何人都可以解释这个概念吗?

5 个答案:

答案 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。