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);
}
}
为什么我的运行结果不一样啊?请高手指教
{
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);
}
}
为什么我的运行结果不一样啊?请高手指教
对于你的主程序来说是这样的流程:
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的概率相对比较高。