Can I use wait instead of sleep?
我遇到一个问题,海报试图让一条线等一秒钟。他们使用的是wait,但在synchronized块外,因此它崩溃了。
对于正在运行的线程,要暂停执行一段给定时间,可以执行以下操作:
这也应该有效,并且结果非常相似:
1 2 3
| synchronized(this) {
this.wait(1000);
} |
使用wait超时,线程将在1秒钟后解除暂停。
问题是:如果我没有任何监视和通知问题,是否有实际的理由使用一个而不是另一个?
- 关于这个问题的有用链接:stackoverflow.com/questions/1036754/…
- @伊凡:是的,我读过这个问题,有人讨论这个问题是评论,但我没有找到确切的答案。
- 答案是他们做不同的事情。sleep()会受到中断的影响。wait()是notify()的主题。它们不是等价的。
- wait和sleep呈现出完全不同的功能。坦率地说,这似乎是另一个问题的复制品。怎么不呢?上面的两个答案很清楚地显示了差异。
- 我知道两者的区别。但在某些情况下(暂停线程的执行),似乎可以执行相同的任务。在链接的问题中有讨论,但没有实际的答案。
- @阿西利亚斯发表了一个非常有趣的答案,被否决并删除了。使用sleep或wait有一个语义值,即wait应该与notify一起使用。
sleep()和wait()都用于保持当前线程,但它们是为不同的用例而设计的:
当您确切地知道您希望线程处于非活动状态的时间长度时,通常使用sleep()。在给定的超时之后,它将自动唤醒,不会受到外界的干扰。如果有紧急情况发生(在这种情况下,对sleep()的调用将以InterruptedException结束),仍有可能有人决定提前唤醒您的线程。例如,用户决定在线程休眠时关闭应用程序,或者类似的情况。
所以,sleep()就像设置一个闹钟在一小时内叫醒你,而你却在打瞌睡。但有人可以早点叫醒你,说大楼着火了,最好起来做点什么。
另一方面,wait()的设计目的是在将来某个时候发生某些事情之前将线程挂起。你不知道要多长时间。必须有外部人员通过在监视器上调用notify()或notifyAll()来唤醒线程(在用于调用wait()的同一对象上)。例如,一个线程已将某个作业委托给另一个线程,并希望休眠到该作业完成为止。您还可以选择限制等待时间,但是在线程可以重新获得监视器之前,它不会继续执行。等待线程仍然可以以与sleep()相同的方式中断。
所以,wait()就像是你车间里唯一的螺丝刀,借给你的同事一段时间,然后决定打个盹儿,直到他或她打完为止。你让他们在你的螺丝起子又有空的时候叫醒你,然后你就可以继续你的工作了。你也可以在sleep()中设置闹钟,但在你把螺丝刀拿回来之前,你将无法继续工作。
当然,这些只是使用这些方法的常见简单方法。您可以根据它们的功能设计自己的使用场景。
JavaDoc中的区别非常明显:
void Object.wait():
Causes the current thread to wait until another thread invokes the notify() method or the notifyAll() method for this object.
void Object.wait(long timeout):
Causes the current thread to wait until either another thread invokes the notify() method or the notifyAll() method for this object, or a specified amount of time has elapsed.
static void Thread.sleep(long millis):
Causes the currently executing thread to sleep (temporarily cease execution) for the specified number of milliseconds, subject to the precision and accuracy of system timers and schedulers.
否则,将询问问题并得到解释性答案。在这里。
- 谢谢你的回答。我知道两者的区别。我想知道,既然两者都可以用来达到暂停线程的目的,那么是否有理由使用一个线程而不是另一个线程。(当没有强制使用的约束时,这样的监视器被保持)。