文档章节

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

j
 javail
发布于 2019/12/11 15:08
字数 1445
阅读 46
收藏 3

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

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

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


#1楼

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

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

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

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

但是在sleep()情况下,这是一种用于将进程保留几秒钟或所需时间的方法。 因为您不需要激发任何notify()notifyAll()方法来获取该线程。 或者,您不需要任何其他线程来回调该线程。 就像如果您希望某事在几秒钟后发生,例如在用户回合之后在游戏中发生一样,您希望用户等到计算机播放后,便可以提及sleep()方法。

还有一个在采访中经常问到的重要差异: 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一样。

本文转载自:https://cs.sofbug.com/question/4Lhq

j
粉丝 3
博文 684
码字总数 0
作品 0
深圳
私信 提问
java中sleep和wait的区别

最近在看java的东西。看到了java多线程,注意到sleep和wait,不太清楚它们之间的区别,便在网上找了下,做下记录; 第一种解释: 功能差不多,都用来进行线程控制,他们最大本质的区别是:slee...

dapengking
2013/09/04
899
0
sleep( ) 和 wait( ) 的这 5 个区别,你知道几个?

sleep(休眠) 和 wait(等待) 方法是 Java 多线程中常用的两个方法,它们有什么区别及一些该注意的地方有哪些呢?下面给大家一一分解。 区别1:使用限制 使用 sleep 方法可以让让当前线程休眠,...

Java技术栈
2018/09/19
0
0
Java中sleep()与wait()的区别

第一种解释: 功能差不多,都用来进行线程控制,他们最大本质的区别是:sleep()不释放同步锁,wait()释放同步缩. 还有用法的上的不同是:sleep(milliseconds)可以用时间指定来使他自动醒过来,如果...

今幕明
2014/03/08
180
0
sleep和wait有什么区别

第一种解释: 功能差不多,都用来进行线程控制,他们最大本质的区别是:sleep()不释放同步锁,wait()释放同步缩. 还有用法的上的不同是:sleep(milliseconds)可以用时间指定来使他自动醒过来,如果...

天王盖地虎626
2018/12/24
27
0
Android 面试题总结 Java基础篇

1.public,private,protected,以及不写时的区别? public >为公共成员变量和函数成员,在整个类内类外都可使用,在子类变为public private >为私有成员变量和函数成员,只在声明的类内可以使用...

派赛克
2016/05/05
46
0

没有更多内容

加载失败,请刷新页面

加载更多

Numpy处理图片方法

在进行图像领域的深度学习的时候经常需要对图片进行处理,包括图像的翻转,压缩,截取等,一般都是用Numpy来处理。处理起来也很方便。 In[3] # 导入需要的包 import numpy as np import matp...

北方的郎
13分钟前
7
0
AMD集中擢升高管:从Intel挖了个高手

  1 月 17 日,AMD 官方宣布多项人事升迁、新人任命,擢升了四位高级副总裁:   AMD 同时还宣布, 聘请行业资深人士 Daniel McNamara 出任高级副总裁兼服务器业务部总经理,负责在第二代...

水果黄瓜
18分钟前
4
0
什么是泛型?

一、泛型的概念 泛型是 Java SE5 出现的新特性,泛型的本质是类型参数化或参数化类型,在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参具体限制的类型。 二、泛型的意义 一般的...

hncboy
52分钟前
7
0
dynamic-connectivity 动态连通性问题之 quick-union 算法

quick-union 的思想是:若对象 p 的 root_id 和对象 q 的 root_id 相等,则认为 p 和 q 连通。 若要将对象 p 和对象 q 连通(已知两对象未连通),则将 p 的 root_id 的值设为 q 的 root_id ...

Phpythoner_Alei
今天
51
0
OSChina 周六乱弹 —— 实在选不出来就唱国歌

Osc乱弹歌单(2020)请戳(这里) 【今日歌曲】 @花间小酌 :#今日歌曲推荐# 分享阿冗的单曲《你的答案》。--祝大家在2020年都找到自己答案。 《你的答案》- 阿冗 手机党少年们想听歌,请使劲...

小小编辑
今天
222
6

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部