sleep、wait、yield、join方法到底有什么区别?

本文详细解析了Java中Thread类的sleep方法,Object类的wait方法,yield方法的作用与区别,以及join方法的用途。重点强调了sleep和wait在锁和唤醒机制上的差异,以及yield如何让高优先级线程有机会执行。

sleep

sleep方法是Thread类中的,不会释放锁,只会阻塞线程,可中断,sleep给其它线程运行机会时不考虑线程的优先级,因此会给低优先级的线程以运行的机会。

wait

wait方法是Object类中的,会释放对象锁,只有当其它线程调用notify才能唤醒此线程。使用wait方法时必须先获取对象锁,即必须在synchronized修饰的代码块中使用,那么相应的notify方法同样必须在synchronized修饰的代码块中使用。

yield

让当前处于运行状态的线程退回到可运行状态,让出抢占资源的机会。和sleep方法一样也是Thread类中的方法,暂停当前正在执行的线程对象,不会释放资源锁,和sleep不同的是yield方法并不会让线程进入阻塞状态,而是让线程重回就绪状态,它只需要等待重新获取CPU执行时间,所以yield的线程有可能在进入到可执行状态后马上又被执行。值得注意的是yield方法只能使用同优先级或更高优先级的线程有执行的机会。

join

在调用join方法的线程执行结束之后,程序再继续执行,一般用于等待异步线程执行结束之后才能继续运行的场景。如一个主线程需要用到子线程的执行结果。

sleep和wait的区别

1.sleep属于Thread类中的static方法,而wait属于Object方法。

2.sleep在Java线程状态中属于TIMED_WAITING时间等待状态,是可以自动被唤醒的,而wait属于WAITING等待状态,需要手动唤醒。

3.sleep方法在执行后不会释放锁资源,而wait方法在执行后会释放锁资源。

4.sleep方法在持有或者不持有锁时都可以直接执行,而wait方法必须在持有锁时才可以执行。

为什么wait方法必须要持有锁?

因为wait方法会将持有锁的线程从Owner仍到WaitSet集合中,这个操作是在修改ObjectMonitor对象,如果没有持有synchronized锁的话,是无法操作ObjectMonitor对象的。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值