在什么情况下Thread.sleep()是暂停线程的最佳方法?

时间:2014-04-15 07:53:01

标签: java multithreading

Thread.sleep()对我来说似乎是一个非常无用的概念,因为我看到它的唯一方式是在以下场景中

 public void someFunction()
 {
      //thread does something
      Thread.sleep(50000);
      //now other threads do something
 }

问题在于,对我而言,这只是在寻找麻烦。我的意思是,这可能要长,在这种情况下,你可能会遇到性能问题而且可能太长而其他线程可能会等待结果,在这种情况下情况可能会变得至关重要。

我的意思是还有其他方法,比如使用synchronized和wait,这看起来效率更高。

所以我的问题是,有没有使用线程睡眠的最佳选择?

6 个答案:

答案 0 :(得分:6)

没有sleep()方法编写java.util.Timer是不可能的,或者至少它会要求你滥用wait()方法,并在其周围编写大量额外代码以防止虚假唤醒

答案 1 :(得分:2)

尽管很多时候事件驱动模型是“等待”某个动作发生的最佳方式,但有时您需要在短时间内故意等待然后再采取行动。 这种情况的一个常见情况是在某些时间段内对数据(来自文件,来自网络等)进行采样/轮询的条件。在这种情况下,您只想在时间间隔之间“刷新”您的数据。

例如,如果您有一个通过网络向Web服务发出请求的应用程序,您可能希望有一个威胁来定期执行此任务,大多数时间都处于“休眠”状态,但执行服务一段时间后请求任务,一次又一次地重复此行为。

答案 2 :(得分:2)

考虑一个服务启动2个不同的线程执行彼此连接的2个不同的事情,其中​​一个线程失败并且捕获到异常(网络问题,远程主机没有回复),您希望您的服务启动并且在最短的时间内运行。最好的事情是等待一段时间然后重新运行失败的线程。您不知道远程主机何时启动,您必须测试连接。在这种情况下,最好的解决方案是等待一段时间,然后重新运行您的线程,而不是无休止地重新运行失败的线程(CPU负载)。

答案 3 :(得分:2)

Thread.sleep(long)Object.wait(long)都会阻止当前线程。但是wait可能会提前返回(虚假唤醒),请参阅javadoc。因此,对于wait,我们需要实现额外的逻辑,以保证指定的时间量过去。因此,如果您只想暂停一下 - 请使用Thread.sleep

答案 4 :(得分:0)

每次想减慢速度时,都会使用Thread.sleep。在某些情况下,您无法进行同步,例如通过网络与数据库等外部系统进行通信。

示例场景:

  • 错误恢复 - 当您的系统依赖于报告临时错误的某个外部实体时。您与无法控制的外部系统进行通信,并且它表示存在与您的请求无关的临时问题。您执行Thread.sleep并重试。如果你没有sleep,你会得到错误泛滥。这是集成中间件中非常常见的模式。
  • 超时 - 等待事情发生但不超过10秒。你不能接受更长的等待并想退出。
  • 限制 - 有人告诉您,除了10秒钟之外,您不能再做一次。

请注意,有多种方法可以通过拨打Thread.sleep来等待,而不是必须等待。

答案 5 :(得分:0)

如果需求规范要求等待5秒钟,也许在某些过程控制线程代码中的某些功能深处,可能仅在某些条件下,Sleep(5000)调用是一个很好的解决方案,原因如下:

  • 不需要将简单的内联代码重写为复杂的代码 状态机,以便能够使用异步计时器。

  • 它不会运行任何其他计时器或池线程来实现超时。

  • 它是一个单行程序,不需要构造等待对象等。

  • 在我曾经使用的所有多任务操作系统上,Sleep()几乎以相同的形式可用。

睡眠()因为:

而变坏
  • 它浪费了一个线程'。在许多系统中,例如。什么时候线程会在那里,并且会在应用程序的生命周期内运行,谁在乎呢?

  • 它常常被误用于线程间通信轮询循环,因此增加了CPU浪费和延迟这确实是站不住脚的。

  • 它通常不能被打断,以便能够“清洁,快速”。 关闭线程。同样,在许多系统中,池或应用程序生命周期线程是否因进程终止而被粗暴地停止并不重要,那么为什么还要尝试呢?

合理使用的例子:

void StartFeedstockDelivery{
  if (airbankPressure()<MIN_PRESSURE){
    startCompressor();
    sleep(10000);  // wait for pressure to build up
  openFeedValve();
};