sleep和wait的应用
2024-07-06 16:59:15
在面试中经常性的遇到wait和sleep的区别?
1.sleep不会释放锁 ,而wait会释放锁
private static final String LOCK = "lock";public static void main(String[] args) {new Thread(() -> {System.out.println(Thread.currentThread().getName() + "====start");test();System.out.println(Thread.currentThread().getName() + "====end");}).start();new Thread(() -> {System.out.println(Thread.currentThread().getName() + "====start");test();System.out.println(Thread.currentThread().getName() + "=====end");}).start();}public static void test() {synchronized (LOCK) {System.out.println(Thread.currentThread().getName() + "====getLock" + System.currentTimeMillis());try {LOCK.wait(5000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() + "====unLock" + +System.currentTimeMillis());}}Thread-0====start
Thread-0====getLock1603173719697
Thread-1====start
Thread-1====getLock1603173719697
Thread-1====unLock1603173724698
Thread-1=====end
Thread-0====unLock1603173724698
Thread-0====end
private static final String LOCK = "lock";public static void main(String[] args) {new Thread(() -> {System.out.println(Thread.currentThread().getName() + "====start");test();System.out.println(Thread.currentThread().getName() + "====end");}).start();new Thread(() -> {System.out.println(Thread.currentThread().getName() + "====start");test();System.out.println(Thread.currentThread().getName() + "=====end");}).start();}public static void test() {synchronized (LOCK) {System.out.println(Thread.currentThread().getName() + "====getLock" + System.currentTimeMillis());try {Thread.sleep(4321L);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() + "====unLock" + +System.currentTimeMillis());}}
Thread-0====start
Thread-1====start
Thread-1====getLock1603173961122
Thread-1====unLock1603173965444
Thread-1=====end
Thread-0====getLock1603173965444
Thread-0====unLock1603173969765
Thread-0====end
2.由上面的代码 我们发现sleep方法是通过Thead的静态方法 而wait是Object对象的方法
3.我们将同步块去掉 会发现sleep方法会正常使用,而wait方法会出错(wait必须依赖同步块)
public static void test() {System.out.println(Thread.currentThread().getName() + "====getLock" + System.currentTimeMillis());try {LOCK.wait(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() + "====unLock" + +System.currentTimeMillis());}Thread-0====start
Thread-1====start
Thread-1====getLock1603174303023
Thread-0====getLock1603174303023
Exception in thread "Thread-1" Exception in thread "Thread-0" java.lang.IllegalMonitorStateExceptionat java.lang.Object.wait(Native Method)at com.zexiang.java.sync.reentrantsync.T.test(T.java:31)at com.zexiang.java.sync.reentrantsync.T.lambda$main$0(T.java:17)at java.lang.Thread.run(Thread.java:745)
java.lang.IllegalMonitorStateExceptionat java.lang.Object.wait(Native Method)at com.zexiang.java.sync.reentrantsync.T.test(T.java:31)at com.zexiang.java.sync.reentrantsync.T.lambda$main$1(T.java:22)at java.lang.Thread.run(Thread.java:745)
4.sleep必须设置时间 而wait则可以都可以 。如果不给时间参数必须要唤醒LOCK.notify();
Thread.sleep(1000);LOCK.wait(1000);LOCK.wait();
最新文章
- 如何解决两个相邻的span中间空隙
- linux在芯片设计与实现,基于Linux的Atheros无线芯片网卡驱动的设计与实现
- idea(mac) 使用收集
- 蓝桥杯——黑色星期五
- SpringBoot 2.0 系列005 --启动实战之SpringApplication应用
- 新主播如何在直播行业混得好
- 联想拯救者 Lenovo Legion 通电自启 插电自启 通电开机 插电开机 Wake on AC
- java虚拟机与安卓虚拟机的区别
- 【shiro基础】springboot + shiro整合thymeleaf
- php微信公众点歌台,PHP实现微信公众平台音乐点播功能
- angular学习-数据绑定
- VSS2005的配置
- .net core with 微服务 - Polly 熔断降级
- 小姐姐都在用的25+技术站点
- 函数嵌套的定义与调用:
- 使用LabVIEW 实现物体识别、图像分割、文字识别、人脸识别等深度视觉
- 小程序毕业设计 基于微信棋牌室小程序毕业设计开题报告功能参考
- 用VMware-workstation虚拟苹果雪豹操作系统遇到的问题
- 科技多元化:基于 HTML5 WebGL 的无人机 3D 可视化系统
- HTC终端4G网络附着问题
热门文章
- 解决未能加载文件或程序集“Newtonsoft.Json ....“或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。 (异常来自 HRESULT:0x80131040)
- 笔记本连接蓝牙未能成功安装设备驱动程序怎么办
- 短网址是什么,短网址有哪些应用场景,如何使用长网址转短网址
- 微信小程序连接华为云ModelArts的方法以及一些小坑(二)
- 奥比中光Orbbec Astra Pro RGBD 3D视觉传感器在ROS(indigo和kinetic)使用说明 rgb depth同时显示
- Python快速入门,附详细视频教程
- 提升移动设备响应式设计的8个建议
- java cron表达式 每天凌晨两点_spring配置定时任务设置为每天凌晨2点执行和每小时执行一次如何配置。...
- 使用Application 上传iOS App
- nginx设置只允许蜘蛛访问其他访问为404或者301跳转