八股文之sleep和wait方法的区别
在Java中,sleep()和wait()方法都能暂停线程的执行,但它们有一些不同之处。
1、sleep属于Thread类中的static方法而wait属于Object类的方法。
2、等待条件是否存在:sleep()方法只是单纯地暂停当前线程的执行,而不关心任何线程间的通信。而wait()方法则需要等待其他线程发送一个notify()或者notifyAll()通知信号,以告知该线程可以继续执行下去了。
3、 锁的持有:sleep()方法不会释放锁,即使当前线程持有某个对象的锁,调用该对象的sleep()方法也不会导致这个锁被释放掉。而在调用wait()方法时,当前线程必须拥有该对象的锁,并在等待期间会释放锁,以让其他线程可以获得锁并修改对象状态。
4、异常处理:sleep()方法会休眠指定时间后自动恢复执行,而wait()方法最好要结合notify()或notifyAll()使用,否则可能会因为死锁、饿死等问题一直处于等待状态 sleep属于TIMED_WAITING,自动被唤醒;wait属于WAITING,需要手动唤醒。
以下是示例代码:
// sleep()方法的示例
public class SleepDemo {public static void main(String[] args) throws InterruptedException {for (int i = 0; i < 5; i++) {System.out.println("Current count: " + i);Thread.sleep(1000); // 休眠1秒钟}}
}// wait()方法的示例
public class WaitDemo {public static void main(String[] args) throws InterruptedException {Object lockObject = new Object();synchronized (lockObject) {System.out.println("准备等待通知信号");lockObject.wait(); // 等待通知信号System.out.println("收到了通知信号,继续执行");}}
}
在以上示例代码中,SleepDemo类使用sleep()方法暂停了当前线程一段时间,WaitDemo类使用wait()方法来进行线程间的通信。WaitDemo类必须在持有lockObject对象的锁的前提下才能调用wait()方法,并等待其他线程发送通知信号。当其他线程调用notify()或者notifyAll()方法时,WaitDemo类就可以收到信号并继续执行了。
八股文之sleep和wait方法的区别相关推荐
- 【Java常识】6.0面向对象认知和Eclipse的实用使用、==号和equals方法的区别
1.曾经写过很多自以为很通俗易懂的面向对象的解释. 如下是目前最通俗的一种解释: 2.Eclipse的补充解释. 运行的快捷键:F11. 3.Eclipse快捷键大全 大全放本文最后,这里主要放常用的 ...
- python中函数和方法的区别?Python编程判断当前获取的对象是函数还是方法
python中函数和方法的区别?Python编程判断当前获取的对象是函数还是方法 目录
- python脚本设置linux环境变量_Linux环境变量export方法与修改文件方法的区别
玩蛇网推荐图文教程:python 列表 要想修改Linux环境变量有两种方法可以实现,但是关于Linux环境变量export方法与修改文件方法的区别你又了解多少呢?设置 Linux 环境变量可以通过 ...
- Jquery empty() remove() detach() 方法的区别
方法简介: empty() This method removes not only child (and other descendant) elements, but also any text ...
- GET和POST两种基本请求方法的区别
GET和POST两种基本请求方法的区别 回退 回退时无害 会再次提交请求 记录 URL可被记录, 用于再访问 不可以 缓存 主动缓存 可手动设置 编码方式 只进行url编码 多种编码方式 参数长度 有 ...
- java线程 yield_Java线程中yield与join方法的区别
长期以来,多线程问题颇为受到面试官的青睐.虽然我个人认为我们当中很少有人能真正获得机会开发复杂的多线程应用(在过去的七年中,我得到了一个机会),但是理解多线程对增加你的信心很有用.之前,我讨论了一个w ...
- Cesium 中两种添加 model 方法的区别
概述 Cesium 中包含两种添加 model 的方法,分别为: 通过 viewer.entities.add() 函数添加 通过 viewer.scene.primitives.add() 函数添加 ...
- 计算属性|| 计算属性与方法的区别:计算属性是基于它们的依赖进行缓存的 ;方法不存在缓存||侦听器
计算属性 1. 为何需要计算属性? 表达式的计算逻辑可能会比较复杂,使用计算属性可以使模板内容更加简洁 2. 计算属性的用法 <!DOCTYPE html> <html lang=& ...
- Service 和 doGet 和 doPost 方法的区别
Service 和 doGet 和 doPost 方法的区别 新建一个JSP文件: get方式 post方式 service方法.doGet方法和doPost方法的区别: 在上面的步骤中,把下图中的m ...
最新文章
- Spring @Autowired 注入为 null
- 简单的C++程序题总结
- ubuntu安装配置elasticSearch(vagrant)
- mybatis学习(15):mybatis连接mysql数据库
- foreach的 多种用法
- 数据中心产品化的蜕变
- PHP underlying structure
- python learning2.py
- inovance变频器说明书参数设置_汇川变频器功能参数设置及实操训练
- plupload上传文件 php,jQuery Plupload上传插件的使用方法详解
- 为了对电脑进行保护,已经阻止此应用 解决办法
- 对接微信二维码支付(native方式)
- 【2020.09.05】基金基础问题答疑汇总
- jdy40程序C语言,C语言习题集
- unity 刷新layout_【Unity源码学习】Layout
- Java开发商用免费必备神器
- css连接html的方式
- 两年后,再议“站内信”的实现
- 基于微信小程序的学生请假系统开发
- c语言二级证题库及详解答案,全国计算机等级考试二级C语言上机题库及其答案详解...