gpt4 book ai didi

java - Thread.sleep() 保证等待吗?

转载 作者:行者123 更新时间:2023-11-30 10:50:48 24 4
gpt4 key购买 nike

考虑这个场景:我想连续调用几个 Web 服务。我只能每 10 秒打一次电话。我有这样的东西:

while(true) //we will break inside the loop eventually
{
//...
try {
Thread.sleep(10000);
}
catch(InterruptedException e)
{
e.printStackTrace();
}
//make web service call here
//...
}

如您所见,这将(希望)大约每 10 秒调用一次。但我担心的是,当 Thread.sleep() 正在执行时,我会在 10 秒之前被打断,随后我将进行一个将被忽略的 Web 服务调用。

这不是一个多线程应用程序,因此它在自己的 JVM 上运行。这是我唯一没有从任何地方对该线程调用 interrupt() 的线程,但我不确定我是否会遇到主机线程调度程序或其他任何问题。

计时的准确性并不重要。我特别不在乎 10 秒是否变成 15 秒。但如果 Thread.Sleep 过早抛出,我就会有麻烦了。

这是实现此行为的正确方法吗?

澄清一下:

1-这不是一个多线程程序

2- 我不想做一个准确的时间,时间可能不准确只要意外异常不会让我过早地退出 try block

最佳答案

I am not sure if I will run into trouble with my host machine's thread scheduler

不,运行时不会出于任何原因中断应用程序线程。只有应用程序中的其他代码(或使用您选择的某些框架拖入的代码)才会中断线程。

每个任务都应该指定一个中断策略:如果线程被中断会发生什么?应用程序不应该在不了解其中断策略并准备好处理后果的情况下中断线程。

因此,为您的线程定义中断策略。在您的应用程序中,这是您不希望发生的事情,如果有人向您的应用程序添加代码以在您的线程上调用 interrupt(),他们就会引入错误。基本上,您的政策是不允许中断。因此,抛出一些未经检查的异常,如 IllegalStateException 是一个有效的响应。

Is this the proper way of implementing this behaviour?

不,不是。当您被打扰时,您应该向调用者发出您被打扰的信号。这应该通过让 InterruptedException 传播回调用者(或具有类似含义的应用程序定义的异常)或通过恢复当前线程的中断状态来完成。假设您的中断策略通过提前终止循环来允许中断。您仍然应该恢复中断状态:

while(true) {
...
try {
Thread.sleep(10000);
} catch(InterruptedException abort) {
Thread.currentThread().interrupt();
break;
}
/* Make web service call here... */
}

关于java - Thread.sleep() 保证等待吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34932698/

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