关于java:我可以使用wait而不是sleep吗?

Can I use wait instead of sleep?

本问题已经有最佳答案,请猛点这里访问。

我遇到一个问题,海报试图让一条线等一秒钟。他们使用的是wait,但在synchronized块外,因此它崩溃了。

对于正在运行的线程,要暂停执行一段给定时间,可以执行以下操作:

1
Thread.sleep(1000);

这也应该有效,并且结果非常相似:

1
2
3
synchronized(this) {
    this.wait(1000);
}

使用wait超时,线程将在1秒钟后解除暂停。

问题是:如果我没有任何监视和通知问题,是否有实际的理由使用一个而不是另一个?


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.

否则,将询问问题并得到解释性答案。在这里。