思路:所属的类型不同、对锁的依赖不同、返回的条件不同
1. 所属的类型不同 -
wait()是Object类的实例方法,调用该方法的线程将进入WTING状态。 - sleep()是Thread类的静态方法,调用该方法的线程将进入TIMED_WTING状态。
2. 对锁的依赖不同 -
wait()依赖于synchronized锁,它必须通过监视器进行调用,在调用后线程会释放锁。 sleep()不依赖于任何锁,所以在调用后它也不会释放锁
3. 返回的条件不同 -
调用wt()进入等待状态的线程,需要由notify()/notifyAll()唤醒,从而返回。 - 调用sleep()进入超时等待的线程,需要在超时时间到达后自动返回。
加分项:
wait()方法也支持超时参数,线程调用带有超时参数的wait()会进入TIMED_WTING状态,在此状态下的线程可以通过notify()/notifyAll()唤醒从而返回,若在达到超时时间后仍然未被唤醒则自动返回。 如果采用Lock进行线程同步,则不存在同步监视器,此时需要使用Condition的方法实现等待。Condition对象是通过Lock对象创建出来的,它的wait()方法会导致线程进入WTING状态,它的带超时参数的wait()方法会导致线程进入TIMED_WTING状态,当调用它的signal()/signalAll()方法时,线程会被唤醒从而返回。