sleep() 和 wait() 的区别
- sleep是线程中的方法,但是wait是Object中的方法。
- sleep方法不会释放lock,但是wait会释放,而且会加入到等待队列中。
- sleep方法不依赖于同步器synchronized,但是wait需要依赖synchronized关键字。
- sleep不需要被唤醒(休眠之后推出阻塞,他的监控状态依然保持着,当指定的时间到了又会自动恢复运行状态),但是wait需要(不指定时间需要被别人中断)。
sleep是线程中的方法,wait是Object中的方法
由 jdk 的源码中可以看出
- sleep是线程中的方法
- wait是Object中的方法
sleep不释放lock,wait会释放
- sleep 不释放 lock 的验证代码:
运行结果:从下面结果中看到,线程2先获取了cpu资源,然后开始执行休眠,在休眠过程中线程1是没法执行的,必须要等待线程2结束之后才可以。这也就是说sleep方法不会释放锁,让其他线程进来。
- wait 释放 lock 的验证代码:
运行结果:从下面的结果中,线程2 wait ,线程1也可以 wait 操作,证明wait是释放了锁资源,让其他线程进来。
sleep不依赖同步方法,wait需要
-
sleep 不依赖同步方法的验证代码:
运行结果:方法依次运行,不会出现任何异常。 -
wait 依赖同步方法的验证代码:
运行结果:方法依次运行,出现任何异常。
sleep不需要被唤醒,wait需要
- sleep 方法很简单,自己就会重新开始执行。
- wait 方法的验证,定义一个等待方法,一个唤醒方法。
测试一下定义的方法:
运行结果:如果没有唤醒方法,那第一个线程就会处于一直等待的状态,第二个线程唤醒了之后就不再等待了。