【问题标题】:is Thread.sleep() guaranteed to wait?Thread.sleep() 保证等待吗?
【发布时间】: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


【解决方案1】:

我不确定我的主机线程调度程序是否会遇到问题

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

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

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

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

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

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

【讨论】:

    【解决方案2】:

    不,不能保证至少等待 10 秒。 sleep 方法抛出检查异常 InterruptedException 的全部意义在于可能需要在 10 秒结束之前通过中断线程来结束睡眠。

    您将注意力集中在“单线程”的程序上是错误的。在实践中没有这样的事情:JVM 和 JRE 被允许(事实上确实)运行额外的线程。 Thread.sleep() API 表示如果休眠线程被另一个线程中断,该方法将抛出 InterruptedException;它没有指定只允许“用户”线程中断睡眠线程。

    【讨论】:

      猜你喜欢
      • 2012-12-08
      • 1970-01-01
      • 2013-10-24
      • 2012-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-25
      相关资源
      最近更新 更多