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()方法时,线程会被唤醒从而返回。