C#学习 - 关于Thread.Yield()和Thread.Sleep()

1. Thread.Yield()

该方法是在 .Net 4.0 中推出的新方法,它对应的底层方法是 SwitchToThread。

Yield 的中文翻译为 “屈服,让步”,这里意思是主动放弃当前线程的时间片,并让操作系统调度其它就绪态的线程使用一个时间片。但是如果调用 Yield,只是把当前线程放入到就绪队列中,而不是阻塞队列。如果没有找到其它就绪态的线程,则当前线程继续运行。Yield可以让低于当前优先级的线程得以运行,调用者可以通过返回值判断是否成功调度了其它线程。注意,Yield只能调度运行在当前CPU上的线程。例如:

            while (true)
            {
                // 主动让出CPU,如果有其他就绪线程就执行其他线程,如果没有则继续当前线程
                var result = Thread.Yield();

                // Do Some Work
                Console.WriteLine("Thread 1 running, yield result {0}", result);
            }

2. Thread.Sleep(n)

   Sleep 的意思是告诉操作系统自己要休息 n 毫秒,这段时间就让给另一个就绪的线程吧。相比 Yield,可以调度任何处理器的线程使用时间片。在休息的 n 毫秒时间内,即使没有其他就绪线程,自己也不再占用CPU。

   当 n=0 的时候,意思是要放弃自己剩下的时间片,但是仍然是就绪状态,其实意思和 Yield 有点类似。但是 Sleep(0) 只允许那些优先级相等或更高的线程使用当前的CPU,其它线程只能等着挨饿了。如果没有合适的线程,那当前线程会重新使用 CPU 时间片。

                while (true)
                {
                    // Sleep 0ms,如果有其他就绪线程就执行其他线程,如果没有则继续当前线程
                    Thread.Sleep(0);

                    Console.WriteLine("Thread 2 running");
                }

猜你喜欢

转载自blog.csdn.net/jianhui_wang/article/details/80591010
今日推荐