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()方法打断的。
本文使用 文章同步助手 同步