sleep(休眠)和wait(等待)是java中多线程常用的两个方法, 本篇来讲述一下二者的区别.
1 使用限制
使用 sleep 方法可以让让当前线程休眠,时间一到当前线程继续往下执行,在任何地方都能使用,但需要捕获 InterruptedException 异常。
而使用 wait 方法则必须放在 synchronized 块或synchronized方法里面,同样需要捕获 InterruptedException 异常,并且需要获取对象的锁。
而且 wait 还需要额外的方法 notify/ notifyAll 进行唤醒,它们同样需要放在 synchronized 块 synchronized 方法或里面,且获取对象的锁。
当然也可以使用带时间的 wait(long millis) 方法,时间一到,无需其他线程唤醒,也会重新竞争获取对象的锁继续执行。
区别2:使用场景
sleep 一般用于当前线程休眠,或者轮循暂停操作,wait 则多用于多线程之间的通信。
区别3:所属类
sleep 是 Thread 类的静态本地方法,wait 则是 Object 类的本地方法。
java.lang.Thread#sleep
java.lang.Object#wait
为什么要这样设计呢?
因为 sleep 是让当前线程休眠,不涉及到对象类,也不需要获得对象的锁,所以是线程类的方法。wait 是让获得对象锁的线程实现等待,前提是要楚获得对象的锁,所以是类的方法。
区别4:释放锁
如上代码所示,wait 可以释放当前线程对 lock 对象锁的持有,而 sleep 则不会。
区别5:线程切换
sleep 会让出 CPU 执行时间且强制上下文切换,而 wait 则不一定,wait 后可能还是有机会重新竞争到锁继续执行的。