sleep(休眠) 和 wait(等待) 方法是 java 多线程中常用的两个方法,它们有什么区别及一些该注意的地方有哪些呢?下面给大家一一分解。
使用 sleep 方法可以让让当前线程休眠,时间一到当前线程继续往下执行,在任何地方都能使用,但需要捕获 interruptedexception 异常。
try { thread.sleep(3000l); } catch (interruptedexception e) { e.printstacktrace(); }
而使用 wait 方法则必须放在 synchronized 块里面,同样需要捕获 interruptedexception 异常,并且需要获取对象的锁。
synchronized (lock){ try { lock.wait(); } catch (interruptedexception e) { e.printstacktrace(); } }
而且 wait 还需要额外的方法 notify/ notifyall 进行唤醒,它们同样需要放在 synchronized 块里面,且获取对象的锁。。
synchronized (lock) { // 随机唤醒 lock.notify(); // 唤醒全部 lock.notifyall(); }
当然也可以使用带时间的 wait(long millis) 方法,时间一到,无需其他线程唤醒,也会重新竞争获取对象的锁继续执行。
sleep 一般用于当前线程休眠,或者轮循暂停操作,wait 则多用于多线程之间的通信。
sleep 是 thread 类的静态本地方法,wait 则是 object 类的本地方法。
java.lang.thread#sleep
public static native void sleep(long millis) throws interruptedexception;
java.lang.object#wait
public final native void wait(long timeout) throws interruptedexception;
为什么要这样设计呢?
因为 sleep 是让当前线程休眠,不涉及到对象类,也不需要获得对象的锁,所以是线程类的方法。wait 是让获得对象锁的线程实现等待,前提是要楚获得对象的锁,所以是类的方法。
object lock = new object(); synchronized (lock) { try { lock.wait(3000l); thread.sleep(2000l); } catch (interruptedexception e) { e.printstacktrace(); } }
如上代码所示,wait 可以释放当前线程对 lock 对象锁的持有,而 sleep 则不会。
sleep 会让出 cpu 执行时间且强制上下文切换,而 wait 则不一定,wait 后可能还是有机会重新竞争到锁继续执行的。
@程序猿 你们还知道别的吗?欢迎留言!
更多干货推荐
2.史上最强 spring boot & cloud 教程整理
更多请扫描下方的二维码关注我们的微信公众号,干货每日推送!
如对本文有疑问, 点击进行留言回复!!
集合框架——Map、泛型以及Collection算法常用方法
Elasticsearch 升级 7.x 版本后,我感觉掉坑里了
Mybatis的插件运行原理以及如何编写一个Mybatis的插件
网友评论