Thread.Sleep(0)和Join()的使用

时间:2014-07-30 22:49:05

标签: c# multithreading

我正在读一本关于多线程程序的书,我发现了这个小例子:

public static class Program
    {
        public static void ThreadMethod()
        {
            for (int i = 0; i < 10; i++)
            {
                Console.WriteLine(“ThreadProc: {0}”, i);
                Thread.Sleep(0);
            }
        }
        public static void Main()
        {
            Thread t = new Thread(new ThreadStart(ThreadMethod));
            t.Start();
            for (int i = 0; i < 4; i++)
            {
                Console.WriteLine(“Main thread: Do some work.”);
                Thread.Sleep(0);
            }
            t.Join();
        }
    }

我心中有太多问题:

1) Thread.Sleep(0)的使用是什么,我的意思是,我已尝试过两种情况:有或没有 Thread.Sleep( 0),运行时没有太大区别

2) t.Join()在这里真的很有用,因为它位于 Main 方法的最后?

1 个答案:

答案 0 :(得分:11)

Thread.Sleep(0)将产生其他线程的优先级低于您的优先级:

  

如果millisecondsTimeout参数的值为零,则线程将其时间片的剩余部分放弃到准备运行的任何具有相同优先级的线程。如果没有其他具有相同优先级的线程准备好运行,则不会暂停执行当前线程。

因此,在这个例子的情况下,尝试使线程以大致相同的速度运行。

Thread.Join用法表明在线程完成工作之前不需要结束程序。但是,正如Scott Chamberlain指出的那样,默认情况下IsBackground属性为false,因此您的线程是前台线程,并且会让程序自行运行,直到它们'完成了他们的工作。如果你的程序有更多事要做,并且通常有,那需要线程的工作结果,那么Join调用真的是必不可少的。

尝试将IsBackground属性设置为不同的值,并尝试删除Join调用,看看会发生什么。