sleep()和wait()的这5个区别,你知道几个?

sleep(休眠) 和 wait(等待) 方法是 Java 多线程中常用的两个方法,它们有什么区别及一些该注意的地方有哪些呢?下面给大家一一分解。

区别1:使用限制

使用 sleep 方法可以让让当前线程休眠,时间一到当前线程继续往下执行,在任何地方都能使用,但需要捕获 InterruptedException 异常。

1
2
3
4
5
try {
Thread.sleep(3000L);
} catch (InterruptedException e) {
e.printStackTrace();
}

而使用 wait 方法则必须放在 synchronized 块里面,同样需要捕获 InterruptedException 异常,并且需要获取对象的锁。

区别2:使用场景

sleep 一般用于当前线程休眠,或者轮循暂停操作,wait 则多用于多线程之间的通信。

区别3:所属类

sleep 是 Thread 类的静态本地方法,wait 则是 Object 类的本地方法。

java.lang.Thread#sleep

1
public static native void sleep(long millis) throws InterruptedException;

java.lang.Object#wait

1
public final native void wait(long timeout) throws InterruptedException;

为什么要这样设计呢?

因为 sleep 是让当前线程休眠,不涉及到对象类,也不需要获得对象的锁,所以是线程类的方法。wait 是让获得对象锁的线程实现等待,前提是要楚获得对象的锁,所以是类的方法。

区别4:释放锁

1
2
3
4
5
6
7
8
9
Object lock = new Object();
synchronized (lock) {
   try {
       lock.wait(3000L);
       Thread.sleep(2000L);
   } catch (InterruptedException e) {
       e.printStackTrace();
   }
}

如上代码所示,wait 可以释放当前线程对 lock 对象锁的持有,而 sleep 则不会。

区别5:线程切换

sleep 会让出 CPU 执行时间且强制上下文切换,而 wait 则不一定,wait 后可能还是有机会重新竞争到锁继续执行的。


发布于 2020-04-01 21:09:29
分享
海报
173
上一篇:一文搞懂Java线程中断 下一篇:深入浅出Java中的包装类
目录

    推荐阅读

    忘记密码?

    图形验证码