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
提供了完全不同的功能。坦率地说,这似乎是另一个问题的重复。怎么不是呢?上面的两个答案清楚地说明了它们之间的区别。我知道这两个答案之间的区别。但是在某些情况下(暂停线程的执行)似乎能够执行相同的任务。在链接的问题中有讨论,但没有实际的答案。谢谢您的回答。我知道两者之间的区别。我想知道,既然两者都可以用来实现暂停线程的目的,那么是否有理由使用其中一个而不是另一个。(当没有强制使用的约束条件时,应持有此类监控器)。