wait()和sleep()之间的区别

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

我是否知道wait() ing线程仍处于运行模式并使用CPU周期,可是sleep() ing不会消耗任何CPU周期正确吗? java

为何咱们 wait()sleep()如何实现他们在一个较低的水平有什么不一样? windows


#1楼

这是一个很是简单的问题,由于这两种方法的用法彻底不一样。 api

主要的区别是等待睡眠时不释放锁定或监视器,而等待时不释听任何锁定或监视器。 等待用于线程间通讯,而睡眠用于引入执行暂停。 多线程

这只是一个清晰而基本的解释,若是您想要的不止这些,请继续阅读。 oracle

在的状况下, wait()方法的线程进入等待状态,它会不会回来,直到自动咱们所说的notify()方法(或notifyAll()若是你有更多的则处于等待状态一个线程,并要唤醒全部的这些线程)。 而且您须要同步或对象锁定或类锁定来访问wait()notify()notifyAll()方法。 还有一点, wait()方法用于线程间通讯,由于若是线程进入等待状态,则须要另外一个线程来唤醒该线程。 编码

可是在sleep()状况下,这是一种用于将进程保留几秒钟或所需时间的方法。 由于您不须要激发任何notify()notifyAll()方法来获取该线程。 或者,您不须要任何其余线程来回调该线程。 就像若是您但愿某事在几秒钟后发生,例如在用户回合以后在游戏中发生同样,您但愿用户等到计算机播放后,即可以说起sleep()方法。 spa

还有一个在采访中常常问到的重要差别: sleep()属于Thread类,而wait()属于Object类。 操作系统

这些都是sleep()wait()之间的区别。 线程

这两种方法之间有一个类似之处:它们都是被检查的语句,所以您须要尝试catch或throws来访问这些方法。

我但愿这能帮到您。


#2楼

这里有不少答案,可是我找不到任何提到的语义区别。

它与线程自己无关; 这两种方法都是必需的,由于它们支持很是不一样的用例。

sleep()使线程像之前同样进入睡眠状态,它只是打包上下文并在预约的时间内中止执行。 所以,为了在适当的时间以前将其唤醒,您须要了解线程引用。 这在多线程环境中并不常见。 它主要用于时间同步(例如,在3.5秒内准确唤醒)和/或硬编码的公平性(只需睡眠一下子,而后让其余线程工做)。

相反, wait()是线程(或消息)同步机制,它使您能够通知没有存储引用的线程(也没必要担忧)。 您能够将其视为发布-订阅模式( wait == subscription和notify() == publish)。 基本上,使用notify()能够发送一条消息(甚至可能根本没有收到,一般您不在意)。

综上所述,一般将sleep()用于时间同步,将wait()用于多线程同步。

它们能够在底层操做系统中以相同的方式实现,也能够根本不实现(由于Java的早期版本没有真正的多线程;可能某些小型VM也不这样作)。 不要忘记Java在VM上运行,所以您的代码将根据其运行的VM / OS / HW进行不一样的转换。


#3楼

一个wait能够“唤醒”被另外一个线程调用notify ,其正在上而等待在监视器上sleep不了。 一样,必须在监视对象上synchronized的块中发生wait (并notify ),而sleep不会:

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

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

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

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

若是监视器上有多个线程在等待,您还能够调用notifyAll -这将唤醒全部线程。 可是,只有一个线程将可以抓住监视器(记住waitsynchronized块中)并继续执行-而后其余线程将被阻塞,直到它们得到监视器的锁为止。

另外一点是,您在Object自己上调用wait (即,在对象的监视器上等待),而在Thread上调用sleep

还有一点是,您能够从wait获得虚假的唤醒(即,正在等待的线程无端恢复运行)。 如下状况下 ,您应该始终wait旋转

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

#4楼

简单来讲,wait是等待,直到其余线程调用您,而sleep是在指定的时间段内“不执行下一条语句”。

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

还有一点,当您在某个对象上调用wait时,所涉及的线程将同步该对象,而后进行等待。 :)


#5楼

waitsleep方法很是不一样:

  • sleep没法“唤醒”,
  • wait在等待期间能够经过另外一个线程调用notifynotifyAll来“唤醒”。

仔细想一想,名字在这方面使人困惑; 可是, sleep是标准名称,而wait就像Win API中的WaitForSingleObjectWaitForMultipleObjects同样。

相关文章
相关标签/搜索