Java中的sleep方法和wait方法

本文详细介绍了Java中Thread的sleep方法和Object的wait方法的区别。sleep方法让线程休眠而不释放对象锁,而wait方法则用于线程间通信,使线程释放对象锁进入等待。wait需在同步环境中使用,与notify配合实现线程间的协调。二者不能互相替代,错误使用wait会导致IllegalMonitorStateException。
摘要由CSDN通过智能技术生成

在JAVA的学习中,不少人会把sleep和wait都搞混,认为都是做线程的等待。比如方法sleep(long)和wait(long)就分不清,下面主要介绍下这俩者是什么,区别在哪。

首先需要明白很重要的一点!

sleep是Thread的方法,wait是Object的方法

由此可知,它俩的本质是不相同的。

区别一,sleep()线程控制自身流程。wait()用来线程间通信,使拥有该对象锁的线程等待直到指定时间或notify()。

Thread线程的方法,很简单,让线程休眠。使cpu让出该线程,等待时间过后,线程又重新进入排队恢复运行。

但是Object的方法就有问题了,Object是java的根基类,所有的对象都来源于此。所以wait方法的目的是让出对象锁,并进入线程等待池,等待一段时间或notify的唤醒并同时得到对象锁后运行。一般与notify一起使用。

区别二,sleep()方法的线程不会释放对象锁。wait()方法的线程会释放对象锁。

wait可以代替sleep吗?
答案不可以,如果直接调用wait会报出java.lang.IllegalMonitorStateException异常,原因是还没有得到对象锁,所以无法释放锁。

那么如何获得锁?
执行对象的某个同步实例方法。
执行对象对应类的同步静态方法。
执行对该对象加同步锁的同步块。
wait是通过控制对象锁来达到通信的目的,如果对象调用了wait,则会使线程交出该对象锁,然后处于等待状态。

比如在三个人看电视中,一个人持有遥控器进行换台,若想实现三个人轮流持有遥控器换台,则类似wait和notify的关系。三个人就是三个线程,电视就是对象,遥控器就是对象锁。首先一个人(线程)持有遥控器(锁),当电视发出wait命令后,这个人交出遥控器(锁),进入等待,电视(对象)发出notify命令后,处于等待的三个人(线程)随机一个获取遥控器(锁)

区别三,适用区域不同,wait只能放在同步语句块中才有意义。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值