Thread.sleep()
对我来说似乎是一个非常无用的概念,因为我看到它的唯一方式是在以下场景中
public void someFunction()
{
//thread does something
Thread.sleep(50000);
//now other threads do something
}
问题在于,对我而言,这只是在寻找麻烦。我的意思是,这可能要长,在这种情况下,你可能会遇到性能问题而且可能太长而其他线程可能会等待结果,在这种情况下情况可能会变得至关重要。
我的意思是还有其他方法,比如使用synchronized和wait,这看起来效率更高。
所以我的问题是,有没有使用线程睡眠的最佳选择?
答案 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
,你会得到错误泛滥。这是集成中间件中非常常见的模式。请注意,有多种方法可以通过拨打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();
};