java中的Thread.sleep()

来源:互联网 发布:任我行crm 知乎 编辑:程序博客网 时间:2024/06/05 07:11

======================================================
注:本文源代码点此下载
======================================================

前两天电面过来,在海吹项目的时候,问到了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)可以看成一个运行态的进程产生一个中断,由运行态直接转入就绪态。这样做是给其他就绪态进程使用时间片的机会。总之,还是操作系统中运行态、就绪态和等待态相互转化的问题。


======================================================
在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定 这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/