面试题:Java中sleep和wait方法的区别
摘要:介绍sleep方法和wait方法的相同点和区别。
在学习JAVA多线程的时候,不少人会把函数sleep和wait搞混,傻傻分不清,简单粗暴地认为都是使得线程进入等待状态,比如就分不清方法sleep(long)和wait(long)。下面主要介绍sleep方法和wait方法的相同点和区别。
关于sleep() 和 wait()方法的异同点是什么的问题,首先需要明白的是sleep()是Thread的静态本地方法,wait()是Object的成员方法,由此可知,二者是有本质区别的。
相同点:
- 一旦执行方法,都可以使得当前的线程进入等待状态。
- 释放占用的CPU资源,使其它线程有机会获得执行权。
- wait和sleep都可以被中断(interrupt)。
不同点:
- 声明位置不同,sleep是声明在Thread类的静态方法,可以在任何线程中使用。wait是声明在Object类的成员方法,与对象的监视器锁相关,只能在同步代码块或同步方法中使用。
- 关于是否可以指定睡眠时间,sleep函数必须指定,wait可以指定也可以不指定。
- sleep(long millis) 会让当前正在运行的、占用CPU时间片的线程挂起指定时间,在休眠时间结束时自动苏醒进入可运行状态;切记,是不会由睡眠状态直接变为运行状态的。wait() 方法用来线程间通信,如果设置了时间,就等待指定时间;如果不设置,则该对象在其它线程被调用 notify() / notifyAll() 方法后进入可运行状态,才有机会竞争获取对象锁。
- 适用场景不同,sleep可以在任何需要的场景下调用,wait()必须在同步代码块或者同步方法的监视器中调用。
- 关于是否释放锁,sleep不会释放锁,线程睡着的时候,如果手里持有一把对象锁,那就一直抱着锁不松开,让其它线程无法得到这把锁,是一种贪婪的做法!wait素质很高,睡着的时候会释放锁,并进入线程等待池,以便其它线程可以获取该锁。
- sleep方法不依赖于同步器synchronized,但是wait需要依赖synchronized关键字。
- 关于唤醒机制,sleep休眠之后退出阻塞,自动唤醒,不涉及线程间的通信;wait在被其它线程调用notify或notifyAll唤醒后,需要重新获取锁才能继续执行,常见于生产者-消费者问题中。
“故不积跬步,无以至千里;不积小流,无以成江海。”
面试题:Java中sleep和wait方法的区别的更多相关文章
- Java中wait和sleep方法的区别
1.两者的区别 这两个方法来自不同的类分别是Thread和Object 最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法(锁代码块和方法锁). wait ...
- 转 Java中wait和sleep方法的区别
1.两者的区别 这两个方法来自不同的类分别是Thread和Object 最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法(锁代码块和方法锁). wait ...
- Java中start和run方法的区别
一.问题引入 说到这两个方法就不得不说多线程,说到多线程就不得不提实现多线程的两种方式继承Thread类和实现Runable接口,下面先看这两种方式的区别. 二. Java中实现多线程 ...
- java中构造方法和普通方法的区别
1.普通方法: 定义:简单的说方法就是完成特定功能的代码块. 普通方法定义格式: 修饰符 返回值类型 方法名 (参数类型 参数名1,参数类型 参数名2,.........) { 函数体: re ...
- java 中sendredirect()和forward()方法的区别
一.文章1 HttpServletResponse.sendRedirect与RequestDispatcher.forward方法都可以实现获取相应URL资源. sendRedirect实现请求重 ...
- Java中构造方法跟普通方法的区别?
构造方法与普通方法的调用时机不同. 首先在一个类中可以定义构造方法与普通方法两种类型的方法,但是这两种方法在调用时有明显的区别. 1.构造方法是在实例化新对象(new)的时候只调用一次 2.普通方法是 ...
- java中getAttribute与getParameter方法的区别
知识点1:getAttribute表示从request范围取得设置的属性,必须要先setAttribute设置属性,才能通过getAttribute来取得,设置与取得的为object对象类型 例: r ...
- Java中==号与equals()方法的区别
String str1 = new String("abc"); String str2 = new String("abc"); System.out.pri ...
- Java 中 interrupted 和 isInterrupted 方法的区别?
interrupt interrupt 方法用于中断线程.调用该方法的线程的状态为将被置为"中断"状态. 注意:线程中断仅仅是置线程的中断状态位,不会停止线程.需要用户自己去监 视 ...
- 面试常见问题:java中wait()和sleep()方法的区别
wait()和sleep()方法都是用来控制多线程的有力工具,那么它们之间有什么巨大的区别呢? 1.wait()方法是属于Object类的,而sleep()方法是属于Thread类的. 2.最重要的一 ...
随机推荐
- 池化层 Pooling Layer
写在前面:人生就是努力.搞不懂.躺平,循环. 文章结构 池化层的相对位置 在多通道任务中,池化层和卷积层的不同 重要的参数stride 与 kernel_size 大小的相对关系决定3种池化层 参数 ...
- 插入排序(LOW)
博客地址:https://www.cnblogs.com/zylyehuo/ # _*_coding:utf-8_*_ def insert_sort(li): for i in range(1, l ...
- study Rust-6【使用结构体组织相关联的数据】
struc(structure) 定义并且实例化结构体: struct User { username: String, email: String, sign_in_count: u64, acti ...
- datasnap的回调广播
感觉中的datasnap千孔百疮,到xe10已经具备冲击成千上万用户并发的能力了.应该放心用于项目实战了.补课研究10.1 datasnap开发手册. 用到的方法: (1)TDBXCallback机制 ...
- springAPI对事物支持之XML式配置
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerData ...
- Windows端口号操作
1.查看所有端口号:netstat -ano 2.查看端口号:netstat -ano | findstr "16888" 3.杀死进程:taskkill /f /pid 8524
- Cursor入门教程-JetBrains过度向
Cursor使用笔记 前置:之前博主使用的是JetBrains的IDE,VSCode使用比较少,所以会尽量朝着JetBrains的使用习惯及样式去调整. 一.设置语言为中文 如果刚上手Cursor,那 ...
- DPDI(Dispatch PDI)kettle调度管理平台升级预告
亲爱的DPDI用户们,久等了!Dispatch PDI全新升级,焕然一新的UI页面计划于2025.03.23正式上线.这一次,我们精心打磨每一个细节,只为给您带来前所未有的丝滑体验,让每一次浏览都成为 ...
- React AntD的Dropdown组件报错:React.Children.only expected to receive a single React element child.可能的n原因
React.Children.only expected to receive a single React element child. Error: React.Children.only exp ...
- xl2411p 显示器分辨率问题 IPS\TN
本来是想玩游戏来着,后来也没能玩起: 留下了个显示器明基xl2411p,昨天扒出来用起来吧. 玩游戏没毛病的,毕竟都是图片不存在文字的渲染问题,日常办公用起来就难受了,TN屏真是难受的了. 本来24寸 ...