前言
这个问题其实也是面试过程中的一个高频面试题目,考察的异同基本是两个的使用和锁的区别,同时这两个方法也是我们使用Java并发编程中较为常见的方法。
那么,这两个方法有什么区别呢?
主要如下的几个异同:
- 作用相同:两个方法都是控制线程的暂停,进入休眠状态。
- wait方法通常被用于线程间交互/通信,sleep方法通常被用于暂停执行。
- 所属类不同:sleep方法属于线程(Thread)类的静态本地(native)方法,而wait方法属于Object类的本地(native)方法。
- 语法不同:sleep方法不依赖于同步器synchronized,但是wait方法需要依赖synchronized关键字。
- 参数不同:sleep方法必须设置参数时间,wait方法可以不设置时间,不设置将一直休眠。
- 释放锁资源不同:sleep方法不会释放lock,但是wait会释放,而且会加入到等待队列中。
- 唤醒方式不同: wait() 方法被调用后,线程不会自动唤醒,需要别的线程调用同一个对象上的 notify()或者 notifyAll() 方法。sleep()方法执行完成后,线程会自动唤醒,或者也可以使用 wait(long timeout) 超时后线程会自动唤醒。
- 线程进入状态不同:调用sleep 方法线程会进入TIMED_WAITING 有时限等待状态,而调用无参数的 wait 方法,线程会进入WAITING无时限等待状态。