java中的Thread.sleep()
前两天电面过来,在海吹项目的时候,问到了Thread.sleep()问题。感觉没什么啊,不就是线程睡眠一下,好让别的线程把任务做完嘛。
我当时为什么要用sleep()呢?是这样:一个主线程负责一项计算任务,它把这项任务分解开,分成n份子任务,每个子任务放到一个线程中,这样n个子任务并行计算。(其实单核情况下,又没有io需求,这样做是不会提高效率的,这里只是顺应并发的思想....)主线程呢,分配好了后,sleep()一下,睡完后把结果收上来整合。喏,就这么回事。
有人提到过两个问题:
1、假设现在是 2008-4-7 12:00:00.000,如果我调用一下 Thread.Sleep(1000) ,在 2008-4-7 12:00:01.000 的时候,这个线程会 不会被唤醒?
2、某人的代码中用了一句看似莫明其妙的话:Thread.Sleep(0) 。既然是 Sleep 0 毫秒,那么他跟去掉这句代码相比,有啥区别么?
这两个问题在http://dev.tot.name/java/html/20090225/20090225101644.htm上做了解释,作者举的ppmm的例子蛮生动的哈。归结起来就是说:在windows环境下,进程调度是抢占式的。一个进程在运行态时调用sleep(),进入等待态,睡眠结束以后,并不是直接回到运行态,而是进入就绪队列,要等到其他进程放弃时间片后才能重新进入运行态。所以sleep(1000),在1000ms以后,线程不一定会被唤醒。sleep(0)可以看成一个运行态的进程产生一个中断,由运行态直接转入就绪态。这样做是给其他就绪态进程使用时间片的机会。总之,还是操作系统中运行态、就绪态和等待态相互转化的问题。