1. 得分点
所属的类型不同、对锁的依赖不同、返回的条件不同、使用方式不同
2. 标准回答
wait()和sleep()方法主要有以下3个区别:
所属类型不同:
wait()
是Object
类的实例方法,调用该方法的线程将进入WAITING
状态sleep()
是Thread
类的静态方法,调用该方法的线程将进入TIMED_WAITING
对锁的依赖不同:
wait()
依赖于synchronized
锁,它必须通过监视器进行调用,在调用后会释放锁sleep()
不依赖任何锁,所以在调用后不会释放锁
返回的条件不同:
- 调用
wait()
进入等待状态的线程,需要由notify()/ notifyAll()
唤醒,进入就绪状态,从而返回 - 调用
sleep()
进入睡眠的线程,在超时时间到达后自动返回或者使用interrupt()
方法中断,进入就绪状态(sleep())方法只是让出CPU,并不会让出同步资源锁
- 调用
使用方式不同:
wait()
只能在同步方法或者同步代码块中调用,否则会报illegalMonitorStateException
异常,如果没有设置超时时间,使用notify()
来唤醒sleep()
能在任何地方调用
3. 加分项
wait()
方法也支持超时参数,线程调用带有超时参数的wait()
会进入TIMED_WAITING
状态,在此状态下的线程可以通过notify()/ notifyAll()
唤醒从而返回,若在超时时间结束后仍未被唤醒则自动返回.如果采用Lock进行线程同步,则不存在同步监视器,此时需要使用Condition的方法实现等待。
Condition对象是通过Lock对象创建出来的,它的await()方法会导致线程进入WTING状态,它的带超时参数的
await()
方法会导致线程进入TIMED_WAITING
状态,当调用它的signal()/signalAll()
方法时,线程会被唤醒从而返回。