线程中的wait()
和sleep()
有什么区别? html
我是否知道wait()
ing线程仍处于运行模式并使用CPU周期,可是sleep()
ing不会消耗任何CPU周期正确吗? java
为何咱们都 wait()
和sleep()
如何实现他们在一个较低的水平有什么不一样? windows
这是一个很是简单的问题,由于这两种方法的用法彻底不一样。 api
主要的区别是等待睡眠时不释放锁定或监视器,而等待时不释听任何锁定或监视器。 等待用于线程间通讯,而睡眠用于引入执行暂停。 多线程
这只是一个清晰而基本的解释,若是您想要的不止这些,请继续阅读。 oracle
在的状况下, wait()
方法的线程进入等待状态,它会不会回来,直到自动咱们所说的notify()
方法(或notifyAll()
若是你有更多的则处于等待状态一个线程,并要唤醒全部的这些线程)。 而且您须要同步或对象锁定或类锁定来访问wait()
或notify()
或notifyAll()
方法。 还有一点, wait()
方法用于线程间通讯,由于若是线程进入等待状态,则须要另外一个线程来唤醒该线程。 编码
可是在sleep()
状况下,这是一种用于将进程保留几秒钟或所需时间的方法。 由于您不须要激发任何notify()
或notifyAll()
方法来获取该线程。 或者,您不须要任何其余线程来回调该线程。 就像若是您但愿某事在几秒钟后发生,例如在用户回合以后在游戏中发生同样,您但愿用户等到计算机播放后,即可以说起sleep()
方法。 spa
还有一个在采访中常常问到的重要差别: sleep()
属于Thread
类,而wait()
属于Object
类。 操作系统
这些都是sleep()
和wait()
之间的区别。 线程
这两种方法之间有一个类似之处:它们都是被检查的语句,所以您须要尝试catch或throws来访问这些方法。
我但愿这能帮到您。
这里有不少答案,可是我找不到任何提到的语义区别。
它与线程自己无关; 这两种方法都是必需的,由于它们支持很是不一样的用例。
sleep()
使线程像之前同样进入睡眠状态,它只是打包上下文并在预约的时间内中止执行。 所以,为了在适当的时间以前将其唤醒,您须要了解线程引用。 这在多线程环境中并不常见。 它主要用于时间同步(例如,在3.5秒内准确唤醒)和/或硬编码的公平性(只需睡眠一下子,而后让其余线程工做)。
相反, wait()
是线程(或消息)同步机制,它使您能够通知没有存储引用的线程(也没必要担忧)。 您能够将其视为发布-订阅模式( wait
== subscription和notify()
== publish)。 基本上,使用notify()能够发送一条消息(甚至可能根本没有收到,一般您不在意)。
综上所述,一般将sleep()
用于时间同步,将wait()
用于多线程同步。
它们能够在底层操做系统中以相同的方式实现,也能够根本不实现(由于Java的早期版本没有真正的多线程;可能某些小型VM也不这样作)。 不要忘记Java在VM上运行,所以您的代码将根据其运行的VM / OS / HW进行不一样的转换。
一个wait
能够“唤醒”被另外一个线程调用notify
,其正在上而等待在监视器上sleep
不了。 一样,必须在监视对象上synchronized
的块中发生wait
(并notify
),而sleep
不会:
Object mon = ...; synchronized (mon) { mon.wait(); }
此时,当前正在执行的线程将等待并释放监视器 。 另外一个线程可能会作
synchronized (mon) { mon.notify(); }
(在同一mon
对象上),第一个线程(假设它是监视器上等待的惟一线程)将唤醒。
若是监视器上有多个线程在等待,您还能够调用notifyAll
-这将唤醒全部线程。 可是,只有一个线程将可以抓住监视器(记住wait
在synchronized
块中)并继续执行-而后其余线程将被阻塞,直到它们得到监视器的锁为止。
另外一点是,您在Object
自己上调用wait
(即,在对象的监视器上等待),而在Thread
上调用sleep
。
还有一点是,您能够从wait
获得虚假的唤醒(即,正在等待的线程无端恢复运行)。 在如下状况下 ,您应该始终wait
旋转 :
synchronized { while (!condition) { mon.wait(); } }
简单来讲,wait是等待,直到其余线程调用您,而sleep是在指定的时间段内“不执行下一条语句”。
此外,sleep是Thread类中的静态方法,它在线程上运行,而wait()在Object类中,而且在对象上调用。
还有一点,当您在某个对象上调用wait时,所涉及的线程将同步该对象,而后进行等待。 :)
wait
和sleep
方法很是不一样:
仔细想一想,名字在这方面使人困惑; 可是, sleep
是标准名称,而wait
就像Win API中的WaitForSingleObject
或WaitForMultipleObjects
同样。