目录
前言
我们可能经常会用到 Thread.sleep()
函数来使线程挂起一段时间。那么你有没有正确的理解这个函数的用法呢?
思考下面这两个问题
- 假设现在是
2008-4-7 12:00:00.000
,如果我调用一下Thread.sleep(1000)
,在2008-4-7 12:00:01.000
的时候,这个线程会不会被唤醒? - 某人的代码中用了一句看似莫明其妙的话:
Thread.sleep(0)
。既然是sleep 0
毫秒,那么他跟去掉这句代码相比,有啥区别么?
回顾操作系统原理
操作系统中,CPU
竞争有很多种策略。Unix
系统使用的是时间片算法,而 Windows
则属于抢占式的
时间片算法
在时间片算法中,所有的进程排成一个队列。操作系统按照他们的顺序,给每个进程分配一段时间,即该进程允许运行的时间
- 如果在时间片结束时进程还在运行,则
CPU
将被剥夺并分配给另一个进程 - 如果进程在时间片结束前阻塞或结束,则
CPU
当即进行切换。调度程序所要做的就是维护一张就绪进程列表,当进程用完它的时间片后,它被移到队列的末尾
抢占式操作系统
就是说如果一个进程得到了 CPU
时间,除非它自己放弃使用 CPU
,否则将完全霸占 CPU
。因此可以看出,在抢占式操作系统中,操作系统假设所有的进程都是“人品很好”的,会主动退出 CPU
- 在抢占式操作系统中,假设有若干进程,操作系统会根据他们的优先级、饥饿时间(已经多长时间没有使用过
CPU
了),给他们算出一个总的优先级来。操作系统就会把CPU
交给总优先级最高的这个进程 - 当进程执