问题
Thread.sleep(millisecond)方法通常用来使线程挂起一段时间。
但是使用sleep(0)似乎和不使用没什么区别,那他的存在没有意义吗?
思考
这其实和操作系统原理有关。
在操作系统中,一般有很多程序来争夺CPU的使用权,而这个争夺有很多策略。
Unix系统使用的是时间片算法。
系统把时间分成一份一份的,每个进入内存等待执行的进程都可以依次执行一段时间,在这段时间内未完成的进程放弃CPU的控制权让给下一个进程使用;如果在这期间进程执行完成或遇到阻塞,则挂起,操作系统得到挂起信号后即将CPU控制权移交给下一个进程,当然挂起的进程会被移动到进程列表的最后。
而Windows系统使用了抢占式的算法。
所谓抢占式,就是程序“霸占”了CPU的使用权,在它完成之前是不会放弃使用权的。
假设在内存中有很多排队等待的进程,操作系统会根据他们的优先级和等待时间计算出优先级,在下一次CPU空闲时,操作系统会把CPU使用权移交给优先级最高的进程。当这个进程执行完成或者主动挂起(遇到I/O等待、sleep等)后,操作系统会重复上面的操作。
再者如果进程长时间霸占CPU,操作系统监视到这种情况后,会使这个进程强制挂起。
sleep()方法
这个方法旨在告诉操作系统,某个进程在未来的一段时间内,不在参与CPU的使用竞争。操作系统在分配CPU时,自然会忽略掉使用sleep方法的进程。例如一个进程使用sleep方法后,一段时间后才会重新进入等待使用CPU的列表,但不代表这个进程会立即被唤醒,而是等待操作系统分配CPU使用而激活。
结论
Thread.sleep(0)并不是一无是处,其作用是放弃CPU的使用权让操作系统中的其他等待进程一起立即再进行一次CPU的使用权竞争,这也给其他等待的进程执行的机会,使得资源分配更加合理,即使下一次获得使用权的还是这个进程。再者也是减少被CPU强制挂起的情况。
本文探讨了Thread.sleep(0)方法的实际作用及其在操作系统调度中的意义。通过介绍Unix的时间片算法与Windows的抢占式算法,解释了此方法如何帮助进程主动放弃CPU使用权,促进资源的合理分配。
994

被折叠的 条评论
为什么被折叠?



