Android中sleep()和wait()的区别

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类:

图1

就定义了两个方法, sleepTime()方法会让调用线程休眠3秒,waitTime() 就打印一句话。两个方法都使用了同步锁。

SleepThread类:

图2

线程类,用于调用SleepOrWaitBean的sleepTime方法.

WaitThread类:

图3

线程类,用于调用SleepOrWaitBean的waitTime方法.

测试:

图4

运行结果:

图5

通过log可以看出,同时启动两个线程运行SleepOrWaitBean类的两个方法,waitSleep()方法并没有立即执行,而是sleepTime()方法睡三秒之后,释放对象锁之后,waitSleep()方法才执行,也就验证了,sleep方法没有释放对象锁。

接着验证wait()

修改代码:

图6


图7

首先运行waitThread线程,运行结果如下:

图8

首先waitThread线程运行起来,运行wait()方法后,进入等待状态,并释放对象锁,sleepThread线程运行起来,拿到对象锁,进入休眠状态,三秒后结束休眠唤醒waitThread线程。

通过代码演示可以得出:

sleep() 和 wait() 的区别就是 调用sleep方法的线程不会释放对象锁,而调用wait() 方法会释放对象锁

你可能感兴趣的:(Android中sleep()和wait()的区别)