sleep()方法会使线程暂停执行一段时间,wait()方法会阻塞线程,直到被唤醒或等待时间超时。
两者区别具体如下:
1 原理不同
sleep()方法是Thread类的静态方法,使线程暂停执行一段时间,等到计时结束,该线程会自动“苏醒”。而wait()方法是Object类的非静态方法,用于线程间的通信,使当前拥有该对象锁的线程等待,直到其他线程调用notify()方法(或notifyAll()方法)时才被唤醒。也可以通过计时即设置超时时间来自动唤醒该线程。
2 对锁的处理机制不同
sleep()方法不涉及线程间的通信,不会释放锁。而wait()方法会使线程释放占有的锁。
3 使用区域不同
sleep()方法可以放在任何地方,而wait()方法只能放在同步块中。
4 是否捕获异常不同
sleep()方法必须捕获异常,而wait()、notify()和notifyAll()这些方法不需要捕获异常。在线程睡眠过程中,有可能被其他对象调用它的interrupt()方法,抛出InterruptedException异常。
综上所述,因为sleep()方法不会释放锁,容易产生死锁问题,所以推荐使用wait()方法。
参考资料
《Java程序员面试笔试宝典》 P149-150