Wait and Sleep

扫码查看

类的区别

  • 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()用于线程状态的控制

01-25 16:50
查看更多