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

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

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

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


当前回答

Wait()是在同步方法中给出的 而sleep()是在非同步方法中给出的,因为wait()方法会释放对象上的锁,而sleep()或yield()会释放对象上的锁。

其他回答

Sleep()方法导致当前线程在指定的时间内从运行状态转移到阻塞状态。如果当前线程拥有任何对象的锁,那么它会一直持有它,这意味着其他线程不能在该类对象中执行任何同步方法。

Wait()方法会导致当前线程在指定的时间内进入阻塞状态或直到notify,但在这种情况下,线程会释放对象的锁(这意味着其他线程可以执行调用对象的任何同步方法)。

等待和睡觉是两回事:

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

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()。当你被放下,在等待的时候再拿一个,那就是等待

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

应该从同步块调用:wait()方法总是从同步块调用,即wait()方法需要在调用它的对象之前锁定对象监视器。但是sleep()方法可以从外部同步块调用,即sleep()方法不需要任何对象监视器。

IllegalMonitorStateException:如果wait()方法被调用而没有获得对象锁,则IllegalMonitorStateException在运行时抛出,但sleep()方法从不抛出此类异常。

属于哪个类:wait()方法属于java.lang.Object类,sleep()方法属于java.lang.Thread类。

在对象或线程上调用:wait()方法在对象上调用,而sleep()方法在线程上调用,而不是在对象上。

线程状态:当在对象上调用wait()方法时,持有对象监视器的线程从运行状态变为等待状态,只有在该对象上调用notify()或notifyAll()方法时才能返回到可运行状态。然后线程调度程序将线程从可运行状态调度到运行状态。 当sleep()在线程上被调用时,它会从运行状态转到等待状态,并在休眠时间结束时返回到可运行状态。

从同步块调用时:当wait()方法被调用时,线程离开对象锁。但是sleep()方法在从同步块或方法线程调用时不会留下对象锁。

更多参考资料

等待会释放锁,而睡眠不会。处于等待状态的线程可以在调用notify或notifyAll时被唤醒。但是在睡眠的情况下,线程保持锁,并且只有在睡眠时间结束时才有资格。