阿里面试:Thread.sleep(0) 到底有什么用?
  5YI10LEk8YTp 2023年11月02日 29 0

我们可能经常会用到 Thread.Sleep 函数来吧使线程挂起一段时间。那么你有没有正确的理解这个函数的用法呢?

阿里面试:Thread.sleep(0) 到底有什么用?_优先级


思考下面这两个问题:

假设现在是 2008-4-7 12:00:00.000,如果我调用一下 Thread.Sleep(1000) ,在 2008-4-7 12:00:01.000 的时候,这个线程会不会被唤醒?

某人的代码中用了一句看似莫明其妙的话:Thread.Sleep(0) 。既然是 Sleep 0 毫秒,那么他跟去掉这句代码相比,有啥区别么?

Thread.Sleep()函数使当前线程睡眠指定的毫秒数,在此期间不会参与CPU调度。睡眠时间结束后,线程进入就绪状态,但无法保证立即获得CPU执行权,还需要等CPU空闲且自己优先级高时才会真正执行。操作系统使用不同算法分配CPU执行权。时间片算法按固定顺序分配时间片,时间片用完就切换下一个线程。抢占式算法总是优先分配给优先级最高的线程,除非它主动释放CPU。可以想象有限时间内分配蛋糕的例子进行类比,时间片算法会按顺序分给每个人固定时间吃蛋糕,抢占式算法会优先满足优先级最高的人,直到他吃饱为止。Windows采用后者,Linux采用前者。

Thread.Sleep(0)的作用是立即触发操作系统重新计算所有线程优先级,当前线程可能会继续执行,也有可能被其他线程抢占。下面代码证明在死循环中调用它可以解决界面假死问题:

while (true) { 
    // CPU密集型计算
    Thread.sleep(0);  // 立即释放CPU,让其他线程(UI线程)更新界面
}

Thread.Sleep()调用后,不能保证会在指定时间唤醒。因为唤醒后,它仍需要等CPU空闲且自己优先级最高才会被选中执行。所以Thread.Sleep(1000)不能保证在1000ms后执行。

综上,Thread.Sleep()让我们精细控制线程调度,这在编写高质量多线程程序很重要。理解操作系统CPU调度机制可以设计出更好的程序,避免假死界面等问题。程序员应熟练掌握Thread.Sleep()的用法与原理。

阿里面试:Thread.sleep(0) 到底有什么用?_优先级_02

近期在连载的八股文,朋友们不要错过

《面试1v1》Java面试八股文

《面试1v1》是我在面试中总结和推理出来的,准备在跳槽时温习回顾使用。

它采用对话的方式、口语化描述技术点,这里没有花费长篇大论的描述 API 怎么用,主要涉及到的都是高频面试题、及工作中如何使用,我还穿插了部分源码解析,因为现在面试中八股文必不可少,让文章由浅入深的更好理解。模拟了在真实面试场景中,候选人该如何回答。

迫不及待要看 面试1v1 全集怎么办?目前在持续更新中,我一般会先更新到公众号,提催更

什么是《面试1v1》?

《面试1v1》是一个以对话形式讲解知识点的文章合集,是由 JavaPub 编写的真人1对1面试对话教程,通过真实案例编写,生动、有趣、干货满满。

为什么要写《面试1v1》这个专题?

我在后台收到很多读者的描述,说自己在面试准备过程中感觉抓不住重点,总是复习的没考、考的没复习。面试过后导致自己自信心受挫,不知道🤷♀️该看点什么来。

这里主要以我的经验给大家一个参照,我们如何在面试中自然的对答,不会因为紧张的忘记。如果用自己的话描述技术难题,避免背课文式的对话。

《面试1v1》有什么用?

文中大多是以实际面试中遇到的情况编写,几乎是大白话式的对话。涉及到的源码我也在对话中做了标注,方便我们查阅遗忘的知识点。

最终的目标是帮助大家更好的掌控面试,拿到心仪offer。

《面试1v1》收费吗,在哪里可以看到全集?

由 JavaPub 完全免费提供,并且持续更新中,在 wx 搜索 JavaPub 就可以直接查看全系列文章。

面试1v1 之后会出第二季吗?

会的,第二季会从大白话源码的角度出发,八股文的朋友不要错过。

《面试1v1》


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
5YI10LEk8YTp