Java中sleep()方法和wait()方法的异同点
①.`wait()`、`notify()`方法必须写在同步方法中,是为了防止死锁和永久等待,使线程更安全,而`sleep()`方法不需要有这个限制。②.`wait()`方法调用后会释放锁`sleep()`方法调用后不会释放锁。③.`sleep()`方法必须要指定时间参数;`wait()`方法可以指定时间参数。④.两个方法所属类不同,`sleep()`方法属于`Thread`类;`wait()`属于
前言
前几篇文章讲过wait()系列方法后,我们来对比看看它和sleep()方法有什么异同点。如果不了解wait()方法也没关系,文章中我会附上涉及到的文章。我们先从sleep()方法讲起,彻底搞清楚二者的区别。
一.sleep()方法是用来做什么的?
sleep()方法可以使线程进入WAITING状态,而且不会占用CPU资源,也不会释放锁,直到过了规定的时间后再执行后续代码,休眠期间如果被中断,会抛出异常,并会清空中断状态标记。
上面这句话信息量有点大,我来给大家细细品读
二.sleep()方法的特点
1. sleep()方法可以使线程进入WAITING状态。
这个和wait()方法一致,都会使线程进入等待状态。
2.不会占用CPU资源。
不会浪费系统资源,可以放心使用。
3.不释放锁。
我记忆的口诀分享:sleep()方法是抱着锁睡觉。
线程休眠期间是不会释放锁的,线程会一直保持在等待状态。
4.响应中断。
遇到中断请求时,支持当前线程中断,并抛出sleep interrupted异常。
代码和分析参考文章
《Java如何正确停止线程(三种场景)》中的“场景二”或“场景三”,代码运行结果和分析都非常简洁和全面,建议阅读下。
三.sleep()方法的两种代码写法
1.Thread.sleep(timeout)
此方式参数只能是毫秒,如果参数是负值,则会抛出异常。虽然常见,但不推荐使用。
2.TimeUnit.SECONDS.sleep(timeout)
此种方式可以接收负数参数,当参数为负数,阅读源码会发现,它会跳过执行,所以不会抛出异常。此种方式的可读性高,可以指定小时、分钟、秒、毫秒、微秒等参数,所以更加优秀,推荐使用这种写法。
四.sleep()方法和wait()方法的异同点
1.相同点
①.都可以使线程堵塞
②.都可以响应中断
2.不同点
①.wait()、notify()方法必须写在同步方法中,是为了防止死锁和永久等待,使线程更安全,而sleep()方法不需要有这个限制。
②.wait()方法调用后会释放锁sleep()方法调用后不会释放锁。
③.sleep()方法必须要指定时间参数;wait()方法可以指定时间参数。
④.两个方法所属类不同,sleep()方法属于Thread类;wait()属于Object类中,放在Object类中是因为Java中每个类都可以是一把锁。
总结
本文讲解了sleep()方法的主要知识,并对比了wait()方法和sleep()方法的区别。喜欢本文请收藏、点赞、关注。关于多线程的其他文章请点击下方链接查看。
建议收藏:
关于synchronized关键字、wait()、notify()方法的系列教程,请参考以下文章:
《Java多线程wait()和notify()系列方法使用教程》
《Java中synchronized实现类锁的两种方式及原理解析》
《Java中synchronized实现对象锁的两种方式及原理解析》
更多推荐



所有评论(0)