对于Thread.Join()方法,MSDN给的定义是:在继续执行标准的 COM 和 SendMessage 消息泵处理期间,阻塞调用线程,直到某个线程终止为止。
很不好理解,Join()其实是让调用该线程的线程等待,只到被调用的线程执行完毕。
如以下代码说明:
public class Apha
{
public void methThread()
{
for (int i = 0; i < 10; i++)
{
Console.WriteLine(Thread.CurrentThread.Name +": i= " + i);
}
}
}
public class Simple
{
static int Main()
{
Apha apha = new Apha();
Thread.CurrentThread.Name = "Main Thread";
Thread o_thread = new Thread(new ThreadStart(apha.methThread));
o_thread.Name = "Sub Thread";
//o_thread.Name = "Sub Threadq"; //报错:This property has already been set and cannot be modified.
for (int j = 0; j < 20; j++)
{
if (j == 10)
{
o_thread.Start();
//o_thread.Abort(); //如果此代码存在,则o_thread不会执行。因为并不是立即执行.Start()方法。
//o_thread.Start(); //报错: Thread is running or terminated; it cannot restart.
o_thread.Join();
}
else
{
Console.WriteLine(Thread.CurrentThread.Name + ": j = " + j);
}
}
Console.ReadLine();
return 0;
}
}
代码中的“o_thread.Join();”要是删除的话,执行结果如下:即主线程和o_thread会交替执行
代码中的“o_thread.Join();”要是不删除的话,执行结果如下:即主线程需等待o_thread线程执行完毕,然后才执行,也就是所说的Join()的作用。
补充:
在上面代码中有两处有注释的地方
1.Thread.CurrentThread.Name只能赋值一次
2.调用o_thread.Start()并不是立即执行。
3.线程一旦终止(Abort()),不能用Start()再启动,会报错。
4.Thread.CurrentThreads是静态属性。
所谓静态属性,就是这个类所有对象所公有的属性,不管你创建了多少个这个类的实例,但是类的静态属性在内存中只有一个。很容易理解CurrentThread为什么是静态的——虽然有多个线程同时存在,但是在某一个时刻,CPU只能执行其中一个。