class Program
     {
        static void Main()
         {
             System.Threading.Thread x = new System.Threading.Thread(new System.Threading.ThreadStart(f1));
            x.Start();
            Console.WriteLine("This is Main.{0}", 1);
            x.Join();
            Console.WriteLine("This is Main.{0}", 2);
            Console.ReadLine();
        }
        static void f1()
        {
            System.Threading.Thread y = new System.Threading.Thread(new System.Threading.ThreadStart(f2));
            y.Start();
            y.Join();
            Console.WriteLine("This is F1.{0}",1);
        }        static void f2()
        {
            Console.WriteLine("This is F2.{0}", 1);
        }
    }
为什么我的运行结果不一样啊?请高手指教

解决方案 »

  1.   

    原因很简单,一般线程启动,如果没有使用锁或者其它同步机制的话,两个或多个线程的执行顺序是完全无法确定的。
    对于你的主程序来说是这样的流程:
    x.Start();
    Console.WriteLine("This is Main.{0}", 1);
    x.Join(); 当你执行完x.Start()时,你就已经无法控制这个线程x与主线程之间的执行关系了,因此有可能出现
    Console.WriteLine("This is Main.{0}", 1);
    先输出,也有可能出现x线程中的输出先执行的情况。但是当你执行完Console.WriteLine("This is Main.{0}", 1);并进入x.Join()语句的时候,主线程开始等待,除非x线程执行完所有的操作(所有的输出都完成),否则主线程不会执行。
    因此可以确保
    Console.WriteLine("This is Main.{0}", 2); 
    这条语句一定会在x线程执行完成之后才会执行。不过需要注意的是,x.Join只会保证x线程执行完成,对于x线程中启动的其它线程,则无法保证。只不过对于你给出的代码来说,在x线程也用同样的方法保证了x线程在结束之前一定会结束y线程。
    y.Join();
    至于具体的输出顺序:
    你可以这样来确定,
    Main2在最后,  F2.1肯定在F1.1之前。大体是这样的:A
    F2.1
    B
    F1.1
    C
    Main2Main1则可以出现在上面所显示的输出结果的A,B,C的任何一个地方。当然,如果不加处理出现在A的概率相对比较高。