sleep、wait、join、yield的区别

sleep(),wait(),join(),yield()的区别

锁池:

所有需要竞争同步锁(sycnchronized)的线程都会放在锁池中,某个对象的锁已经被其中一个线程得到,其他线程需要在这个锁池中进行等待,当前面的线程释放同步锁后,锁池中的线程去竞争同步锁,当某个线程获得同步锁已经其他所需资源(除cpu资源外)后会进入就绪队列,等待分配cpu资源运行.

等待池:

当我们调用了wait()方法后,线程会放在等待池中,等待池的线程是不会去竞争同步锁的,只有调用了notify()或者notifyAll()方法后等待池的线程才会开始竞争锁,notify()是随机从等待池中选出一个线程放到锁池,而notifyAll()是将等待池中的全部线程放到锁池当中.

sleep()和wait()的区别:

  1. sleep是Thread类的静态本地方法,wait是object类的本地方法;

  2. sleep方法是不会释放lock,但是wait会释放,而且wait会加入到等待队列中;

    slee就是把cpu的执行资格和执行权释放出去,一定时间内不再运行池线程,超时之后再取回cpu资源,参与cpu调度,获取到cpu资源后就可以继续运行,如果执行sleep()时,该线程有锁,sleep会带着这个锁进入冻结状态,即sleep该线程,与该线程竞争锁的其他线程也获取不到锁,从而不可能进入就绪状态.如果在sleep期间其他线程调用了interrupt()方法,那么这个线程会抛出interruptexception异常,这点和wait是一样的.

  3. sleep方法不依赖于同步锁,可以独立使用,而wait()需要依赖同步锁synchronized关键字;

  4. sleep不需要被唤醒(超时后自动退出阻塞),但是wait需要被中断(需要其他线程notify唤醒);

  5. sleep一般用于当前线程休眠,或者轮循暂停操作,wait则多用于多线程之间的通信;

  6. sleep会让出cpu执行时间且强制上下文切换,而wait则不一定,wait后可能还有机会重新竞争到锁继续执行.

yield():

yield()执行后线程直接进入就绪状态,马上释放cpu的执行权,但是依然保留了cpu的执行资格,所以有可能cpu下次进行线程调度还会让这个线程获取到cpu资源继续执行.

join():

join()执行后线程进入阻塞状态,例如在线程B中调用了A的join(),那么线程B会进入阻塞状态,直到线程A结束或者中断线程.

  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

莽晨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值