Java 线程中sleep和wait区别

本文详细解析了Java中线程的各种状态,包括新建、可运行、阻塞、计时等待、等待和终止状态。同时对比了Thread.sleep()与Object.wait()方法的区别,如锁释放、调用位置及应用场景的不同。

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

100146_iQfq_273042.png

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”异常

转载于:https://my.oschina.net/u/273042/blog/1574900

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值