考虑这种情况:
我想连续进行几个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块

最佳答案



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

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

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



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

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

10-04 12:01
查看更多