class Program
    {
        static private bool done;
        static void Main(string[] args)
        {
            Thread t = new Thread(Go);
            t.Start();
            Go();
        }
        static void Go()
        {
            //Console.WriteLine("1");
            if (!done) 
            {
                Console.WriteLine("Done");
                done = true;
                Console.WriteLine("2");
            }
        }
    }
该程序的运行结果是
Done
2
Done
2
如果去掉注释,运行结果就变成:
1
Done
2
1
求解释为什么?
线程c#

解决方案 »

  1.   

    因为你把它注释了啊 注释了 就没有了 就不执行了 如果你把Console.WriteLine("2");也注释了
    执行结果还变成了
    Done
    Done
    Done
    Done
    了呢
      

  2.   

    我问的是为什么第一次if判断执行了2次,而第二次if判断只执行了一次,而且你说的注释了Console.WriteLine("2");会输出4个Done也是不成立的吧!
      

  3.   


    只输出一个Done
    你这个也只是一个两个线程 调试起来也还可以 你可以单步走试一下!!!
      

  4.   

    那为什么注释了输出结果会有2个Done;第二次done 不也是应该变成true了么?
      

  5.   

    那为什么注释了输出结果会有2个Done;第二次done 不也是应该变成true了么?
    应该是线程的调用顺序不同导致的。因为线程是由操作系统调度,每次哪个线程在前面可以不同。你把代码改成class Program
        {
            static private bool done;
            static void Main(string[] args)
            {
                //Thread t = new Thread(Go);
              // t.Start();
                Go();
                Go();
                Console.ReadLine();
            }
            static void Go()
            {
               // Console.WriteLine("1");
                if (!done)
                {
                    Console.WriteLine(done.ToString());
                    done = true;
                    Console.WriteLine("2");
                }
            }
        }
    看看运行结果 就知道了。
      

  6.   

    那为什么注释了输出结果会有2个Done;第二次done 不也是应该变成true了么?
    应该是线程的调用顺序不同导致的。因为线程是由操作系统调度,每次哪个线程在前面可以不同。你把代码改成class Program
        {
            static private bool done;
            static void Main(string[] args)
            {
                //Thread t = new Thread(Go);
              // t.Start();
                Go();
                Go();
                Console.ReadLine();
            }
            static void Go()
            {
               // Console.WriteLine("1");
                if (!done)
                {
                    Console.WriteLine(done.ToString());
                    done = true;
                    Console.WriteLine("2");
                }
            }
        }
    看看运行结果 就知道了。
    也就是说是因为线程不在内存中调用,所以不会影响done的值是吗?
      

  7.   

    那为什么注释了输出结果会有2个Done;第二次done 不也是应该变成true了么?
    应该是线程的调用顺序不同导致的。因为线程是由操作系统调度,每次哪个线程在前面可以不同。你把代码改成class Program
        {
            static private bool done;
            static void Main(string[] args)
            {
                //Thread t = new Thread(Go);
              // t.Start();
                Go();
                Go();
                Console.ReadLine();
            }
            static void Go()
            {
               // Console.WriteLine("1");
                if (!done)
                {
                    Console.WriteLine(done.ToString());
                    done = true;
                    Console.WriteLine("2");
                }
            }
        }
    看看运行结果 就知道了。
    也就是说是因为线程不在内存中调用,所以不会影响done的值是吗?目前我也就知道这么多了,太高深的也不明白,也不敢胡乱回答。