类的区别
- wait()来自于
java.lang.Object
,任何对象都有此方法 - sleep()来自于
java.lang.Thread
,调用的对象为线程
用法上的区别
看一下jdk的描述:
使当前线程挂起,当对象调用java.lang.Object.notify()
或者java.lang.Object.notifyAll()
或者时间到期,则从wait()中恢复执行
在指定的时间内使当前执行的线程睡眠(暂停执行)
同步与锁的不同
wait()与sleep()最主要的区别就在于同步与锁,wiat()必须放在synchronized block中,否则会在program runtime时扔出java.lang.IllegalMonitorStateException
异常。
- wait()期间对象锁是释放的
调用sleep()的时候锁并没有被释放,调用yield()也属于这种情况
synchronized(LOCK) { Thread.sleep(1000); // LOCK is held } synchronized(LOCK) { LOCK.wait(); // LOCK is not held }
一般而言,wait()用于线程间的通信,sleep()用于线程状态的控制