【发布时间】:2016-01-21 19:31:45
【问题描述】:
考虑这种情况: 我想连续进行几次 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 块
【问题讨论】:
-
查看时间。如果距您上次请求不到十秒,请按您需要睡眠的时间睡眠。然后重复,直到时钟显示超过十秒。
-
我很失望我的问题被标记为重复,另一个问题根本没有解决我的具体问题。我在问操作系统调度程序(不是 JVM 调度程序)是否会减少我睡觉的时间。
-
@DavidSchwartz 感谢 David 与我分享这个解决方案。不过,我提出问题的主要动机是了解我解决此问题的方法存在哪些缺陷。
-
在执行操作之前检查时钟没有陷阱。
-
不不,我知道。我说我的解决方案的陷阱不是你的
标签: java multithreading jvm