线程中的wait()和sleep()有什么区别?

我是否理解wait()-ing线程仍然处于运行模式并使用CPU周期,但sleep()-ing不消耗任何CPU周期正确?

为什么我们同时使用wait()和sleep()?

它们的实现在较低级别上有什么不同?


当前回答

简单地说,wait是等待,直到其他线程调用你,而sleep是在指定的一段时间内“不执行下一个语句”。

此外,sleep是Thread类中的静态方法,它在线程上操作,而wait()是Object类中的静态方法,在对象上调用。

还有一点,当你在某个对象上调用wait时,线程同步该对象,然后等待。:)

其他回答

等待和睡觉是两回事:

在sleep()中,线程在指定的时间内停止工作。 在wait()中,线程停止工作,直到被等待的对象被通知,通常由其他线程通知。

一个尚未提及的关键区别是:

sleep()不会释放它在线程上持有的锁, 同步(锁){ thread . sleep (1000);// LOCK被持有 } Wait()释放它在对象上持有的锁。 同步(锁){ LOCK.wait ();// LOCK不被持有 }

这里wait()将处于等待状态,直到它被另一个线程通知,而sleep()将有一段时间,之后它将自动转移到就绪状态…

Wait()和sleep()的区别?

thread . sleep () 一旦它的工作完成,它就会向所有人释放锁。直到它永远不会向任何人释放锁。

  Sleep() take the key, its never release the key to anyone, when its work completed then only its release then only take the key waiting stage threads.

Object.wait () 当它进入等待阶段时,它将释放键,并根据参数等待一些秒。

例如:

你的右手拿着咖啡,你可以拿另一个同手的任何一个人,什么时候你会放下然后只拿另一个同类型的物体在这里。也。这是sleep() 你睡觉的时候你什么工作都没做,你只是在睡觉。这里也一样。

wait()。当你被放下,在等待的时候再拿一个,那就是等待

你在你的系统中播放电影或任何东西,就像播放器一样,你一次不能播放多个,对吧,就是在这里,当你关闭并选择另一个任何人的电影或歌曲时,这意味着等待

一个等待线程可以被另一个调用正在被等待的监视器上的notify线程“唤醒”,而一个睡眠线程则不能。另外,一个wait(和notify)必须发生在monitor对象上同步的块中,而sleep则不会:

Object mon = ...;
synchronized (mon) {
    mon.wait();
} 

此时,当前正在执行的线程等待并释放监视器。另一个线程可以

synchronized (mon) { mon.notify(); }

(在同一个mon对象上)和第一个线程(假设它是在监视器上等待的唯一线程)将被唤醒。

如果有多个线程在监视器上等待,您也可以调用notifyAll—这将唤醒所有线程。但是,只有一个线程能够获取监视器(记住,等待是在同步块中)并继续执行—其他线程将被阻塞,直到它们获得监视器的锁。

另一点是你在对象本身调用wait(即你在对象的监视器上调用wait),而你在线程上调用sleep。

还有一点是,你可以从wait中得到虚假的唤醒(例如,正在等待的线程没有明显的原因就恢复了)。你应该总是等待在某些条件下旋转,如下所示:

synchronized {
    while (!condition) { mon.wait(); }
}