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

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

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

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


当前回答

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

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

还有一点,当你在某个对象上调用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()。当你被放下,在等待的时候再拿一个,那就是等待

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

这是一个非常简单的问题,因为这两种方法有完全不同的用途。

主要的区别是等待释放锁或监视器,而sleep在等待时不释放任何锁或监视器。Wait用于线程间通信,而sleep用于执行时引入暂停。

这只是一个清晰而基本的解释,如果你想了解更多,请继续阅读。

在wait()方法的情况下,线程进入等待状态,它不会自动返回,直到我们调用notify()方法(或notifyAll()如果你有多个线程处于等待状态,你想唤醒所有这些线程)。您需要同步或对象锁或类锁来访问wait()或notify()或notifyAll()方法。还有一件事,wait()方法用于线程间通信,因为如果一个线程处于等待状态,您将需要另一个线程来唤醒该线程。

但是对于sleep(),这是一个用于将进程保持几秒钟或您想要的时间的方法。因为您不需要调用任何notify()或notifyAll()方法来取回线程。或者你不需要任何其他线程来回调那个线程。比如,如果你想让某些事情在几秒钟后发生,比如在游戏中,在用户轮到自己之后,你想让用户等待直到电脑开始运行,那么你可以使用sleep()方法。

还有一个在面试中经常被问到的更重要的区别:sleep()属于Thread类,wait()属于Object类。

这些就是sleep()和wait()之间的所有区别。

这两个方法之间有一个相似之处:它们都是checked语句,所以你需要try catch或throws来访问这些方法。

我希望这对你有所帮助。

来源:http://javaconceptoftheday.com/difference-between-wait-and-sleep-methods-in-java/

wait()方法。

1)调用wait()方法的线程释放它持有的锁。

2)在其他线程调用同一锁上的notify()或notifyAll()方法后,线程重新获得锁。

3) wait()方法必须在同步块内调用。

4) wait()方法总是在对象上被调用。

5)等待中的线程可以通过调用notify()或notifyAll()方法被其他线程唤醒。

6)要调用wait()方法,线程必须有对象锁。

睡眠()方法

1)调用sleep()方法的线程不释放它持有的锁。

2) sleep()方法可以在同步块内部或外部调用。

3) sleep()方法总是在线程上调用。

4)睡眠线程不能被其他线程唤醒。如果这样做,线程将抛出InterruptedException。

5)调用sleep()方法时,线程不需要有对象锁。

等待和睡眠的方法非常不同:

睡眠无法“唤醒”, 而wait在等待期间有一种“唤醒”的方式,由另一个线程调用notify或notifyAll。

仔细想想,这些名字在这方面令人困惑;然而,sleep是一个标准名称,而wait就像Win API中的WaitForSingleObject或WaitForMultipleObjects。

睡眠/中断和等待/通知之间的一个潜在的巨大区别是

在sleep()期间调用interrupt()总是抛出异常(例如InterruptedException),而 在wait()期间调用notify()不会。

在不需要的时候生成异常是低效的。如果线程之间的通信速率很高,那么如果一直调用interrupt,就会产生很多异常,这完全是浪费CPU。