wait和sleep的区别
整体的区别其实是有四个:
1、sleep是线程中的方法,但是wait是Object中的方法。
2、sleep方法不会释放lock,但是wait会释放,而且会加入到等待队列中。
3、sleep方法不依赖于同步器synchronized,但是wait需要依赖synchronized关键字。
4、sleep不需要被唤醒(休眠之后推出阻塞),但是wait需要(不指定时间需要被别人中断)。
下面我们就根据这四个区别来分析。
一、sleep是线程方法,wait是Object方法
这个如何验证呢?我们还需要到jdk源码中看看。首先进入到Thread的源码中看一下,然后俺ctrl+O就可以查看方法列表。在最上面可以搜寻,我们输入“s”,就可以查看所有以s开头的方法了。
![](https://pics2.baidu.com/feed/bd3eb13533fa828b03ad4cd4722bd931970a5a31.jpeg?token=f8725a08f3091953b06a6dea92277bbd&s=696A851A199FC0CA4E441CDB020050B0)
我们会发现,slee方法真实的在Thread线程类中。下面我们以同样的方法查看wait。
![](https://pics0.baidu.com/feed/314e251f95cad1c802c62764f10aff0cc93d512a.jpeg?token=f807d1b79934074d2702732a71ebc363&s=EDAA851A979969CA546D19DB020050B0)
这是第一个区别很容易验证,下面我们来看第二个。
二、sleep不释放lock,wait会释放
这个如何验证呢?这就需要代码了。先看我们的sleep方法
![](https://pics0.baidu.com/feed/71cf3bc79f3df8dccaf03bb44325ea8e461028fb.jpeg?token=620feda7426578e14d579f55c33dd8a0&s=B281B14CD2BC966F5451B50E0000E0C1)
我们看一下运行结果:
![](https://pics2.baidu.com/feed/d4628535e5dde71119dcaf8328db561e9d166177.jpeg?token=9e24626063e9313f0707b57cffee75c5)
在上面的结果中,线程2先获取了cpu资源,然后开始执行休眠,在休眠过程中线程1是没法执行的,必须要等待线程2结束之后才可以。这也就是说sleep方法不会释放锁,让其他线程进来。
然后我们测试一下wait方法。
![](https://pics7.baidu.com/feed/279759ee3d6d55fb8ec3901be316d74f20a4dd44.jpeg?token=dc5194c00faee583fdda1049fd340a50&s=BA81F14C92BC866F5451B40E0000E0C1)
在上面的例子中,我们使用wait方法等待10秒钟,然后结束。我们看一下结果:
![](https://pics6.baidu.com/feed/72f082025aafa40f85a6060225509b4a79f01943.jpeg?token=2e760646475c9dab7d401bfbc58c9224)
这个过程就验证了第二条区别,我们接下来看第三个。
三、sleep不依赖同步方法,wait需要
我们还是一次来验证。首先我们测试sleep方法。
![](https://pics7.baidu.com/feed/279759ee3d6d55fb0c291185e016d74f21a4dd64.jpeg?token=848ed5dea33514da3609bcbd36e923f0&s=3281B14CD2B4BE6D5E41950E0000E0C1)
这个方法会依次运行,不会出现任何异常。然后我们主要是看wait方法。
![](https://pics2.baidu.com/feed/f603918fa0ec08fa0ca38855d4daa56854fbda5f.jpeg?token=690d44107be3619287df5aacfd84e900&s=B281B14C52B4BE6D1ED1940E0000F0C1)
我们运行以下,看一下结果:
![](https://pics4.baidu.com/feed/d000baa1cd11728b778ec90546c85bcbc3fd2c2b.jpeg?token=78b4305f5d5ffd5cf9dee6461331e013&s=7AE6AC1ACD20CC031E7528DB020050B5)
OK,下面我们验证一下第四条区别:
四、sleep不需要被唤醒,wait需要
sleep方法很简单,我们主要关注wait方法。看代码:
首先我们定义两个方法,一个等待方法,一个唤醒方法。
![](https://pics4.baidu.com/feed/9825bc315c6034a83b199f7e4627d1510823760b.jpeg?token=a7b56051f42b25dcc3830e0474640067&s=3A81E14E92BE866F0E75981E00007081)
然后再去测试一下:
![](https://pics6.baidu.com/feed/7aec54e736d12f2efcef83f4c2f64d6784356871.jpeg?token=0cf296dbdd7556193382356574d147a8&s=3A81B14CD2F4BE6C1CE5DD0F00007081)
如果没有唤醒方法,那第一个线程就会处于一直等待的状态,第二个线程唤醒了之后就不再等待了。