如何在Java中正确使用thread.sleep()?

如何在Java中正确使用thread.sleep()?,java,Java,我在我们的代码库中看到了以下许多代码片段: try { Thread.sleep((int)Millis); } catch (InterruptedException e) { } 显然,空的catch子句不是一个好主意。如果线程被中断,休眠期将不会完全结束 我想知道如果我的代码中没有中断线程的逻辑,JVM会中断正在睡眠的线程吗?如果是这样,如何确保线程睡眠到其指定的周期结束 使用thread.sleep()方法的最佳实

我在我们的代码库中看到了以下许多代码片段:

        try {
            Thread.sleep((int)Millis);
        } catch (InterruptedException e) {
        }
显然,空的catch子句不是一个好主意。如果线程被中断,休眠期将不会完全结束

我想知道如果我的代码中没有中断线程的逻辑,JVM会中断正在睡眠的线程吗?如果是这样,如何确保线程睡眠到其指定的周期结束


使用
thread.sleep()
方法的最佳实践是什么?

既然评论已经链接到了关于为什么应该捕获InterruptedException的问题的答案,我将集中讨论第二个问题-关于
thread.sleep()
的使用

当您希望在线程执行中引入短暂暂停时,此方法非常方便。例如,假设您必须更新数据库中的100000行,但为了降低对数据库的影响,您需要在两次更新查询之间引入中断,例如2秒。其中一个快速而肮脏的解决方案如下所示:

for (int i = 0; i < 100 000) {
   statement.executeUpdate(....);
   Thread.sleep(2000);
}
因此,没有什么比这更重要的事情要做了,为了不在CPU上产生无用的负载,您需要等待异步计算完成


wait
相比,方法
sleep
保留线程获取的监视器上的锁也很重要。这意味着您可以在同步块中使用它,并期望线程能够在睡眠返回后(当然,如果线程未被中断)继续在该块中执行的工作。

相关-除了上面的注释,答案还取决于您是否在意。如果您不关心线程在从睡眠状态返回之前是否被中断,那么就不必担心。另一方面,如果睡眠后的代码取决于睡眠完成(或线程的状态),那么您应该监控例外情况。在询问如何正确地对睡眠进行编码之前,您会询问睡眠者在那里做什么。正确编写的应用程序根本不需要睡眠。
    int someNumberOfMillisToSleep = //some number;
    ...

    while (!future.isDone()) {
        Thread.sleep(someNumberOfMillisToSleep );
    }

    /*now that future.isDone() returned true, 
you can get the result and go on with on with you logic
   */ 
    int res = future.get();

    //some computation here