一、sleep是Thread的方法,wait是Object的方法
二、sleep不释放锁,wait会释放
线程调用sleep方法后,当前线程会进行睡眠,且线程进入阻塞状态,但不会释放已持有的锁(如果有的话,如果没有锁也可以执行sleep方法)。即线程只会让出cpu执行时间片,不会释放同步资源锁。
线程执行wait方法后,当前线程会进入阻塞等待状态,让出cpu执行时间片的同时释放同步资源锁(一定有锁,因为wait方法必须和synchronized或Lock一起使用,即第三点)
三、sleep不依赖同步方法,wait依赖
执行wait()报错
报错信息
可见wait方法必须在同步代码区中执行(synchronized或lock)。而sleep方法不需要。
四、sleep不需要被唤醒,wait需要。
sleep比较简单,我们着重看一下wait,我们可以去查看到源码中的一段注释。
jdk源码中wait方法的注释
翻译一下就是:
导致当前线程等待,直到另一个线程为此对象调用notify()方法或notifyAll()方法。 换句话说,此方法的行为就像它简单地执行调用wait(0)一样。
当前线程必须拥有该对象的监视器。线程释放对此监视器的所有权,并等待直到另一个线程通过调用notify方法或notifyAll方法通知等待在该对象的监视器上唤醒的线程。然后线程等待,直到可以重新获得监视器的所有权并恢复执行。
与在一个参数版本中一样,可能发生中断和虚假唤醒,并且该方法应始终在循环中使用:...此方法只能由作为此对象的监视器的所有者的线程调用。有关线程可以成为监视器所有者的方式的说明,请参见{@code notify}方法。