Java基础 -> sleep()、wait()、join()、yield()之间的的区别

本文深入探讨了Java多线程中的关键方法sleep(), wait(), join(), 和yield()的使用和区别。sleep()方法使线程进入等待状态,不释放锁;wait()则释放锁并进入等待池,需要被notify()唤醒。join()用于线程合并,让调用线程等待目标线程完成;yield()使当前线程让出CPU但不释放锁,进入就绪状态。这些方法在多线程同步和通信中扮演重要角色。
摘要由CSDN通过智能技术生成

sleep()、wait()、join()、yield()之间的的区别

内部锁

  • 每个对象都有内部锁,内部锁会维护两个集合结构
  • Entry Set(网上有叫锁池): 多个线程抢锁,没抢到的线程加入锁池(Entry Set)
  • Wait Set(网上有叫等待池): 调用wait⽅法阻塞的线程,会加入这个等待池Wait Set
  • 一个线程只能加入锁池或者等待池,线程不管加入哪个池,都代表此时已经不在持有锁了
    • 没抢到锁的,不持有锁,调用wait方法的也不持有锁
  1. sleep 是 Thread 类的静态本地⽅法,wait 则是 Object 类的本地⽅法。

  2. sleep⽅法不会释放lock,但是wait会释放,⽽且sleep⽅法会加⼊到等待队列中。

    • sleep就是把cpu的执⾏资格和执⾏权释放出去,不再运⾏此线程,当定时时间结束再取回cpu资源
  3. sleep⽅法不依赖于同步器synchronized,但是wait需要依赖synchronized关键字。

  4. sleep不需要被唤醒(休眠之后推出阻塞),但是wait需要(不指定时间需要被别⼈中断)。

    • wait需要用notify唤醒的原因是可以进行线程通信
  5. sleep ⼀般⽤于当前线程休眠,或者轮循暂停操作,wait 则多⽤于多线程之间的通信。

  6. yield()执⾏后线程直接进⼊就绪状态,⻢上释放了cpu的执⾏权,但不释放锁

  7. join()执⾏后当前线程进⼊阻塞状态,强制执行指定的线程

    • join方法内部也是调用wait方法阻塞当前线程
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值