前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >线程常用方法对比

线程常用方法对比

作者头像
黑洞代码
发布2021-02-09 10:49:20
2760
发布2021-02-09 10:49:20
举报

sleep()和 wait()对比

  1. 两者最主要的区别在于:sleep() 方法没有释放锁,而 wait() 方法释放了锁 。
  2. 两者都可以暂停线程的执行。
  3. wait() 通常被用于线程间交互/通信,sleep() 通常被用于暂停执行。
  4. wait() 方法被调用后,线程不会自动苏醒,需要别的线程调用同一个对象上的 notify() 或者 notifyAll() 方法。sleep() 方法执行完成后,线程会自动苏醒。或者可以使用 wait(long timeout) 超时后线程会自动苏醒。

yield()和sleep()的区别

  1. sleep()方法会给其他线程运行的机会,而不考虑其他线程的优先级,因此会给较低优先级的一个运行的机会,yield()方法只会给相同优先级或者更高优先级的线程一个运行的机会。
  2. 当线程执行了sleep()方法后,将转到阻塞状态,参数millis指定睡眠时间,当线程执行yield()方法后,将转到就绪状态。
  3. sleep()方法声明抛出InterruptedException异常,而yield()方法没有声明抛出任何异常。

wait()和join()的区别

  1. 一种特殊的wait,当前运行线程调用另一个线程的join()方法,当前线程进入阻塞状态直到另一个线程运行结束等待该线程终止。注意该方法也需要捕捉异常。
  2. 主线程创建并启动了子线程,如果子线程中需要进行大量耗时运算,而主线程要取得这个数据值才能运行,这时就要用到 join()方法了。

notify()和notifyAll()的区别

  1. notify()只会随机选取一个处于等待池中的线程进入锁池去竞争获取锁的机会。
  2. notifyAll()会让所有处于等待池的线程全部进入锁池去竞争获取锁的机会。

锁池和等待池

Java平台中,因为有内置锁的机制,每个对象都可以承担锁的功能。Java虚拟机会为每个对象维护两个“队列”(姑且称之为“队列”,尽管它不一定符合数据结构上队列的“先进先出”原则):一个叫Entry Set(入口集),另外一个叫Wait Set(等待集)。对于任意的对象objectX,objectX的Entry Set用于存储等待获取objectX这个锁的所有线程,也就是传说中的锁池,objectX的Wait Set用于存储执行了objectX.wait()/wait(long)的线程,也就是等待池。

锁池和等待池

线程的生命周期

线程的生命周期

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-02-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 落叶飞翔的蜗牛 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • sleep()和 wait()对比
    • yield()和sleep()的区别
      • wait()和join()的区别
        • notify()和notifyAll()的区别
          • 锁池和等待池
            • 线程的生命周期
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档