我可以用等待而不是睡觉吗?
这个问题在这里已经有了答案:
sleep()
和wait()
都用于保持当前线程,但它们是针对不同的用例设计的:
sleep()
通常用于确切知道线程闲置多长时间。 在给定的超时后,它会自动唤醒,不受外部干扰。 如果发生紧急事件(在这种情况下, sleep()
的调用将以InterruptedException
结束sleep()
,仍然有人可能会提前唤醒线程。 例如,用户决定在线程休眠时关闭应用程序,或者类似的东西。
所以, sleep()
就像设置一个闹钟在一个小时内唤醒你,同时打瞌睡。 但有人可以早点叫醒你说建筑物着火了,最好是站起来做点什么。
另一方面, wait()
目的是让线程暂停,直到将来某个时候发生。 你不知道需要多长时间。 必须有外面的人通过调用监视器上的notify()
或notifyAll()
来唤醒线程(与用于调用wait()
的相同对象上)。 例如,一个线程已经将一些工作委托给另一个线程,并希望在工作完成之前进入休眠状态。 您也可以选择限制等待时间,但线程只有重新获取显示器后才能继续执行。 等待的线程仍然可以像sleep()
一样被中断。
所以, wait()
就像是工作坊里唯一的螺丝刀,借给你的同事一段时间,并决定休息一下,直到他或她完成。 当您的螺丝刀再次释放并且您可以继续工作时,请他们叫醒您。 您也可以像sleep()
一样设置闹钟sleep()
,但在您拿回螺丝刀之前,您将无法恢复工作。
当然,这些只是通常使用这些方法的简单方法。 您可以根据其功能设计自己的使用场景。
javadoc中的区别非常明显:
void Object.wait()
:使当前线程等待,直到另一个线程调用此对象的notify()
方法或notifyAll()
方法。
void Object.wait(long timeout)
:导致当前线程等待,直到另一个线程调用此对象的notify()
方法或notifyAll()
方法或经过指定的时间量。
static void Thread.sleep(long millis)
:使当前正在执行的线程休眠(暂时停止执行)指定的毫秒数,这取决于系统定时器和调度程序的精度和准确性。
否则,这个问题会被询问并在这里得到解释的答案。
链接地址: http://www.djcxy.com/p/92135.html