wait和sleep的区别

186 阅读1分钟

wait方法和sleep方法在操作系统层面,都会让线程进入阻塞状态。在Java层面,sleep会让线程进入TIMED_WAITING 状态,而wait方法通过是否传入参数来决定是转为WAITING状态还是TIMED_WAITING状态。 他们俩都是让线程不会再被分配cpu。那有哪些区别呢。

主要有以下方面的区别:

1.使用场景限制

sleep是Thread的静态方法,不管是在加锁里面,还是未加锁。都可以使用。但wait方法必须在Syn块儿里面进行使用,wait是Object对象中的方法。

2.使用的方法

sleep不需要其他方法对他进行唤醒,只需要当时间到了,自动由TIMED_WAITING状态转为RUNNABLE状态。 而wait方法要配合notify或者notifyAll方法进行唤醒。唤醒操作也需要在Syn块儿中进行调用。

3.是否需要释放锁

sleep在syn块儿中是不会释放锁的。当时间一到,就会重新将状态转为RUNNABLE。因为一直持有锁,所以也不会去和阻塞队列中进行竞争。wait在syn中会释放当前锁,并且当被唤醒时,并不会立即获得锁,还要去阻塞队列进行争抢锁,争抢到了才可以变为RUNNABLE状态。

最后,无论是sleep或者还是wait的带时间和不带时间的方法,都是可以通过interrupt()方法打断的。

本文使用 文章同步助手 同步