如何在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