关于java:Thread.sleep和object.wait

Thread.sleep and object.wait

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

两者都试图做相似的事情,这对线程有一定的影响。

我知道thread.sleep是让当前线程休眠,wait可以让任何线程等待,如果它们试图获取对象的锁。

问题是,大多数时候他们都在做类似的事情——是什么让你选择一个而不是另一个?


不,Object.wait()也只会导致当前线程阻塞。

主要区别在于sleep()指示当前线程休眠一段时间,而wait()指示当前线程释放监视器,然后休眠,直到监视器收到通知。换句话说,wait()是线程之间的协调原语,而sleep()只关心时间的推移(假设没有中断)。


睡眠和等待看起来是决定性的,它们有很多不同:

睡眠-让线程在给定的时间内睡眠-有利于安排任务、动画等…

等待-通常不受时间限制地使用,使一个线程等待某个对象,这是同步的最佳实践。

如果你试图通过睡眠来实现等待,那是一种糟糕的做法,这有点接近于一种非常糟糕的事情,叫做忙着等待。


这两种方法的作用非常不同:Thread.sleep等待指定的时间,而Object.wait等待通知事件(可能需要任意的时间)。

两者都只能使当前线程休眠。另外,Object.wait要求当前线程持有与对象相关联的监视器。


一个用于同步线程,另一个用于休眠给定的时间。

如果要同步线程,请用户等待/通知。如果您想睡眠一段已知的时间,请使用thread.sleep。