gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:01:00 24 4
gpt4 key购买 nike

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

        try {
Thread.sleep((int)Millis);
} catch (InterruptedException e) {
}

显然,空的 catch 子句不是一个好主意。如果线程被中断, hibernate 期将不会完全结束。

我想知道如果我的代码中没有中断线程的逻辑,JVM 可以中断正在 hibernate 的线程吗?如果是这样,如何确保线程 hibernate 到其指定时间段结束?

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

最佳答案

由于评论已经链接到关于为什么您应该捕获 InterruptedException 的问题的答案,我将重点关注您的第二个问题 - 关于 Thread.sleep() 的使用。

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

for (int i = 0; i < 100 000) {
statement.executeUpdate(....);
Thread.sleep(2000);
}

在这里,每次更新后你等待 2 秒,然后才去执行下一个更新。 (请记住,这只是概念的说明,而不是要复制粘贴的完整的生产就绪代码)。

当您等待某些资源可用并且不想在等待资源可用时浪费 CPU 周期时,会发生另一种典型情况。例如,您进行了一个返回 Future 的异步调用,并且您希望等待异步计算完成以继续执行您的逻辑。它通常是这样做的:

    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

因此,为了不在 CPU 上产生无用的负载,您没有更重要的事可做,而是等待异步计算完成。

同样重要的是,与 wait 相比,方法 sleep 保留线程获取的监视器上的锁。这意味着您可以在同步块(synchronized block)中使用它,并期望线程能够在 sleep 返回后继续它在该 block 中所做的工作(当然,如果线程没有被中断)。

关于java - 如何在 Java 中正确使用 thread.sleep()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29115634/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com