Thread.Sleep(0)与Thread.Sleep(1)的区别

时间:2021-08-18 22:27:05
[MSDN对其参数的描述]
millisecondsTimeout 
线程被阻塞的毫秒数。指定零 (0) 以指示应挂起此线程以使其他等待线程能够执行。指定 Infinite 以无限期阻塞线程。 
------------------------------------------------------------------------
于是我这样子做:
while (!isQuit)
{
     if (file.isHasData)
     {
          ....//进行处理
     }
     else
     {
          Thread.Sleep(0);
     }
}

我起初认为这样子做此循环便会在isHasData为false时此线程仅占用很少的CPU,因为它会主动放弃系统为其分配的时间片,但事实上运行过程中CPU使用率几乎一直保持100%。
然后我将Thread.Sleep(0)改成Thread.Sleep(1),一切便如我所想像,CPU利用率降下来了。

1)1毫秒引起的结果为什么差别会这么大呢?
2)请问我这么做可以吗?

5 个解决方案

#1


具体情况具体对待,没有上下文不好说啊~
单从你实验过的角度,当然可行了

#2


sleep(1)要注意线程死锁问题, 0则不用考虑,如果只有一个线程访问你文件哈稀表,用sleep(1)吧

#3


我推荐用WaitHandle实现线程同步,比如ManualResetEvent

#4


的确是这样.我以前也遇到过这样的问题.

楼主可以这样算:
sleep(0)等于死循环,一秒可以执行多少次大概几万,几百万.没试过,但数字一定很大.
sleep(1)才1毫秒,但一秒最多执行1000次.

#5


to Sunmast(《.NET企业服务》翻译完毕):
可我不是用来实现线程同步目的,我只是想一直检测某一条件,比如一个ArrayList,如果有数据,做一定处理然后清空ArrayList。然后继续循环。

to lidong6(立冬):
呵,我也是像你这么考虑的。

#1


具体情况具体对待,没有上下文不好说啊~
单从你实验过的角度,当然可行了

#2


sleep(1)要注意线程死锁问题, 0则不用考虑,如果只有一个线程访问你文件哈稀表,用sleep(1)吧

#3


我推荐用WaitHandle实现线程同步,比如ManualResetEvent

#4


的确是这样.我以前也遇到过这样的问题.

楼主可以这样算:
sleep(0)等于死循环,一秒可以执行多少次大概几万,几百万.没试过,但数字一定很大.
sleep(1)才1毫秒,但一秒最多执行1000次.

#5


to Sunmast(《.NET企业服务》翻译完毕):
可我不是用来实现线程同步目的,我只是想一直检测某一条件,比如一个ArrayList,如果有数据,做一定处理然后清空ArrayList。然后继续循环。

to lidong6(立冬):
呵,我也是像你这么考虑的。