Java 我可以用等待代替睡眠吗?

Java 我可以用等待代替睡眠吗?,java,multithreading,Java,Multithreading,我遇到一个问题,海报试图让一条线等待一秒钟。他们使用的是等待,但是在同步块之外,因此它崩溃了 给定一个正在运行的线程,要在给定时间内暂停执行,可以执行以下操作: Thread.sleep(1000); 这也应该起作用,并且有非常相似的结果: synchronized(this) { this.wait(1000); } 使用等待超时,线程将在1秒后解除暂停 问题是:如果我没有任何监控和通知问题,是否有实际理由使用一个而不是另一个?区别非常明显: void Object.wait():

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

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

Thread.sleep(1000);
这也应该起作用,并且有非常相似的结果:

synchronized(this) {
    this.wait(1000);
}
使用
等待
超时,线程将在1秒后解除暂停


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

区别非常明显:

void Object.wait()
: 使当前线程等待,直到另一个线程调用此对象的
notify()
方法或
notifyAll()
方法

无效对象。等待(长超时)
: 使当前线程等待,直到另一个线程调用此对象的
notify()
方法或
notifyAll()
方法,或者经过指定的时间

静态无效线程。睡眠(长毫秒)
: 根据系统计时器和调度程序的精度和准确性,使当前执行的线程休眠(暂时停止执行)指定的毫秒数

否则,问题会被提出并得到解释性的答案 .

使用
sleep()
wait()
将当前线程挂起,但它们是针对不同的用例设计的:

sleep()
通常在您确切知道希望线程处于非活动状态多长时间时使用。在给定的超时之后,它将自动唤醒,不会受到外部干扰。如果发生紧急事件,仍有可能会有人决定提前唤醒您的线程(在本例中,对
sleep()
的调用将以
InterruptedException
结束)。例如,用户决定在线程处于休眠状态时关闭应用程序,或者类似的情况

所以,
sleep()
就像设置一个闹钟,让你在打瞌睡时在一小时内醒来。但是有人可以早点叫醒你,告诉你大楼着火了,最好起来做点什么

另一方面,
wait()
,被设计为在将来某个时候发生某些事情之前暂停线程。你不知道要花多长时间。外部必须有人通过在监视器上调用
notify()
notifyAll()
唤醒线程(在用于调用
wait()
的同一对象上)。例如,一个线程已将某个作业委派给另一个线程,并希望在该作业完成之前一直处于休眠状态。您还可以选择限制等待时间,但线程在重新获取监视器之前不会继续执行。等待的线程仍然可以中断,中断方式与使用
sleep()
相同

所以,
wait()
就像车间里只有你一把螺丝刀,把它借给你的同事一段时间,然后决定打个盹儿,直到他或她做完。你让他们叫醒你,当你的螺丝刀又空了,你可以继续你的工作。您也可以像在
sleep()
中那样设置闹钟,但在拿回螺丝刀之前,您将无法继续工作


当然,这些只是使用这些方法的常用简单方法。你可以根据它们的功能设计自己的使用场景。

这方面的有用链接:@Ivan:是的,我读过这个问题,关于这个问题的讨论是评论,但我没有找到确切的答案。答案是它们做不同的事情。sleep()易受干扰。wait()受notify()约束。它们并不等同。
wait
sleep
提供了完全不同的功能。坦率地说,这似乎是另一个问题的重复。怎么不是呢?上面的两个答案清楚地说明了它们之间的区别。我知道这两个答案之间的区别。但是在某些情况下(暂停线程的执行)似乎能够执行相同的任务。在链接的问题中有讨论,但没有实际的答案。谢谢您的回答。我知道两者之间的区别。我想知道,既然两者都可以用来实现暂停线程的目的,那么是否有理由使用其中一个而不是另一个。(当没有强制使用的约束条件时,应持有此类监控器)。