sleep(休眠) 和 wait(等待) 方法是 Java 多线程中经常使用的两个方法,它们有什么区别及一些该注意的地方有哪些呢?下面给你们一一分解。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;
为何要这样设计呢?code
由于 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 教程整理
更多请扫描下方的二维码关注咱们的微信公众号,干货每日推送!