Java 线程中sleep和wait区别

Thread的状态,先来看看Thread类里面都有哪几种状态(Enum Thread.State):

BLOCKED 阻塞状态,当遇到synchronized或者lock且没有取得相应的锁,就会进入这个状态
NEW 新建状态,线程创建且没有执行start方法时的状态
RUNNABLE 可运行状态,线程已经启动,但是等待相应的资源(比如IO或者时间片切换)才能开始执行
TERMINATED 终止状态,线程中断或者运行结束的状态
TIMED_WAITING 计时等待,当调用Thread.sleep()或者Object.wait(xx)或者Thread.join(xx)或者LockSupport.parkNanos或者LockSupport.partUntil时,进入该状态
WAITING 等待状态,当调用Object.wait或者Thread.join()且没有设置时间,在或者LockSupport.park时,都会进入等待状态。

接下来看sleep和wait的区别

1. sleep是Thread的一个静态(static)方法。使得Runnable实现的线程也可以使用sleep方法。而且避免了线程之前相互调用sleep()方法,引发死锁。

2. wait方法是在Object上的,而sleep方法是在Thread上,所以sleep不会释放线程的锁,wait会释放线程的锁和资源。

3. 执行时需要赋予一个沉睡时间。在沉睡期间(阻塞线程期间),CPU会放弃这个线程,执行其他任务。当沉睡时间到了之后,该线程会自动苏醒,不过此时线程不会立刻被执行,而是要等CPU分配资源,和其他线程进行竞争。

4. wait(xxx) 可以挂起线程,并释放对象的资源,等计时结束后自动恢复;wait()则必须要其他线程调用notify或者notifyAll才能唤醒。

5. wait必须放在synchronized block中,否则会在运行时报“java.lang.IllegalMonitorStateException”异常

猜你喜欢

转载自my.oschina.net/u/273042/blog/1574900