我们可能经常会用到 Thread.Sleep 函数来吧使线程挂起一段时间。那么你有没有正确的理解这个函数的用法呢?
思考下面这两个问题:
假设现在是 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()的用法与原理。
近期在连载的八股文,朋友们不要错过
《面试1v1》Java面试八股文
《面试1v1》是我在面试中总结和推理出来的,准备在跳槽时温习回顾使用。
它采用对话的方式、口语化描述技术点,这里没有花费长篇大论的描述 API 怎么用,主要涉及到的都是高频面试题、及工作中如何使用,我还穿插了部分源码解析,因为现在面试中八股文必不可少,让文章由浅入深的更好理解。模拟了在真实面试场景中,候选人该如何回答。
迫不及待要看 面试1v1 全集怎么办?目前在持续更新中,我一般会先更新到公众号,提催更
什么是《面试1v1》?
《面试1v1》是一个以对话形式讲解知识点的文章合集,是由 JavaPub 编写的真人1对1面试对话教程,通过真实案例编写,生动、有趣、干货满满。
为什么要写《面试1v1》这个专题?
我在后台收到很多读者的描述,说自己在面试准备过程中感觉抓不住重点,总是复习的没考、考的没复习。面试过后导致自己自信心受挫,不知道🤷♀️该看点什么来。
这里主要以我的经验给大家一个参照,我们如何在面试中自然的对答,不会因为紧张的忘记。如果用自己的话描述技术难题,避免背课文式的对话。
《面试1v1》有什么用?
文中大多是以实际面试中遇到的情况编写,几乎是大白话式的对话。涉及到的源码我也在对话中做了标注,方便我们查阅遗忘的知识点。
最终的目标是帮助大家更好的掌控面试,拿到心仪offer。
《面试1v1》收费吗,在哪里可以看到全集?
由 JavaPub 完全免费提供,并且持续更新中,在 wx 搜索 JavaPub 就可以直接查看全系列文章。
面试1v1 之后会出第二季吗?
会的,第二季会从大白话源码的角度出发,八股文的朋友不要错过。