这程序我照书上打的,书上说这程序输出结果应该是2个线程的结果交替的显示出来,可为什么我这显示的结果总是先是main线程的结果,然后才是worker线程的结果?using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;namespace _CSharp_Console
{    class Program
    {
        static void ShowNumbers()
        {
            Thread thisThread = Thread.CurrentThread;
            Console.WriteLine("Starting Thread: " + thisThread.Name);
            int n = 10000000;
            for (int i = 1; i < 8 * n; i++)
            {
                if (i % n == 0)
                    Console.WriteLine(thisThread.Name + ":count has reached " + i);
            }
        }        static void Main(string[] args)
        {
            Thread thisThread = Thread.CurrentThread;
            thisThread.Name = "Main";            Thread worker = new Thread(delegate()
            {
                ShowNumbers();
                Console.WriteLine("Worker Thread Finished");
            });
            worker.Name = "Worker";            ShowNumbers();  //主线程调用ShowNumbers函数
            worker.Start(); //worker线程调用ShowNumbers函数
                        Console.WriteLine("Main Thread Finished");
            
            Console.ReadLine();
        }    }
}

解决方案 »

  1.   

    ShowNumbers();  //主线程调用ShowNumbers函数
    worker.Start(); //worker线程调用ShowNumbers函数等待ShowNumbers()执行完后才会启动work线成2个位置互换一下。
      

  2.   

    using System;
       using System.Threading;   public class DoSomethingThread
       {
         static void WorkerMethod()
         {
           for(int i = 1; i < 1000; i++)
           {
             Console.WriteLine("Worker Thread: " + i.ToString());
           }
         }     static void Main()
         {
           ThreadStart ts = new ThreadStart(WorkerMethod);
           Thread t = new Thread(ts);
           t.Start();
           for(int i = 1; i < 1000; i++)
           {
             Console.WriteLine("Primary Thread: " + i.ToString());
           }       Console.ReadLine();
         }
       }
      

  3.   

    Your output may be somewhat different every time. The thread execution will be switched at different points in the loop every time. But your concatenated results will look something like this:
       Primary Thread: 1
       Primary Thread: 2
       Primary Thread: 3
       ...
       Worker Thread: 743
       Worker Thread: 744
       Worker Thread: 745
       ...
       Primary Thread: 1000
      

  4.   

    将这两行换个位置即可..ShowNumbers();  //主线程调用ShowNumbers函数
                worker.Start(); //worker线程调用ShowNumbers函数->>>>>改成:            worker.Start(); //worker线程调用ShowNumbers函数
                ShowNumbers();  //主线程调用ShowNumbers函数
    即先启动子线程..
      

  5.   

    原因如下:如果你先调用ShowNumbers方法,然后再启动线程:
    ShowNumbers();  //主线程调用ShowNumbers函数
    worker.Start(); //worker线程调用ShowNumbers函数由于你调用ShowNumbers后,主线程会阻塞在这个方法,直到方法返回,才会继续往下执行,即这个方法调用结束后才会执行下面的启动子线程的操作,然后子线程才会运行,就不会表现出交替调用的现象...
      

  6.   

    这种多线程的执行情况本来就是不确定 的,与你的软硬件环境有关,如果你的CPU高,可能一个工作单位时间一个线程就运行完了,如果想看效果,可以再加大循环的次数!
      

  7.   

    而如果你调换一下顺序:worker.Start(); //worker线程调用ShowNumbers函数
    ShowNumbers();  //主线程调用ShowNumbers函数即先启动子线程,然后调用主线程的方法,这时你一启动子线程(worker.Start();),继续执行下面的代码(ShowNumbers(); ),而不会阻塞,这时就会有两个线程同时在运行(主线程了子线程),所以就会表现出交替出现的现象....
      

  8.   

    调换位置后,输出结果如下:Starting Thread: Main
    Starting Thread: Worker
    Main:count has reached 10000000
    Worker:count has reached 10000000
    Main:count has reached 20000000
    Worker:count has reached 20000000
    Main:count has reached 30000000
    Worker:count has reached 30000000
    Main:count has reached 40000000
    Worker:count has reached 40000000
    Main:count has reached 50000000
    Worker:count has reached 50000000
    Main:count has reached 60000000
    Worker:count has reached 60000000
    Main:count has reached 70000000
    Worker:count has reached 70000000
    Main Thread Finished
    Worker Thread Finished