1.首先这两个方法来自不同的类,sleep方法是Thread类的静态方法,而wait是Object类的方法。
2.wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用(使用范围)如果不在同步方法或者同步代码块中运行,会抛 java.lang.IllegalMonitorStateException: object not locked by thread before wait()异常。
3.最主要是sleep方法没有释放对象锁,而wait方法释放了对象锁,使得其他线程可以使用同步控制块或者方法。
结合synchronized,会更好的理解sleep()和wait()这两个方法,当然也就知道了他们的区别了。这篇博客就一起学习这两个方法
下面用一个例子来演示sleep():
SleepOrWaitBean类:
就定义了两个方法, sleepTime()方法会让调用线程休眠3秒,waitTime() 就打印一句话。两个方法都使用了同步锁。
SleepThread类:
线程类,用于调用SleepOrWaitBean的sleepTime方法.
WaitThread类:
线程类,用于调用SleepOrWaitBean的waitTime方法.
测试:
运行结果:
通过log可以看出,同时启动两个线程运行SleepOrWaitBean类的两个方法,waitSleep()方法并没有立即执行,而是sleepTime()方法睡三秒之后,释放对象锁之后,waitSleep()方法才执行,也就验证了,sleep方法没有释放对象锁。
接着验证wait()
修改代码:
首先运行waitThread线程,运行结果如下:
首先waitThread线程运行起来,运行wait()方法后,进入等待状态,并释放对象锁,sleepThread线程运行起来,拿到对象锁,进入休眠状态,三秒后结束休眠唤醒waitThread线程。
通过代码演示可以得出:
sleep() 和 wait() 的区别就是 调用sleep方法的线程不会释放对象锁,而调用wait() 方法会释放对象锁