1.利用Thread的Join方法,实现1个主线程与多个子线程
1.1 主线程创建一个新线程:Thread newThread = new Thread(...);
1.2 主线程让新线程开始执行:newThread.Start(....);
1.2.1 流程1:此时新线程仍然在执行
1.2.1.1 主线程对新线程执行Join: newThread.Join(); 主线程会阻塞(卡)在这个语句。
1.2.1.2 新线程执行完毕
1.2.1.3 主线程继续执行剩余语句。此流程完毕。
1.2.2 流程2:此时新线程已经执行完毕
1.2.2.1 主线程对新线程执行Join: newThread.Join(); 这个语句会立即执行完毕
1.2.2.2 主线程继续执行剩余语句。此流程完毕。
例子:
1 function 主线程方法() 2 { 3 输出("主线程_步骤1_准备执行子线程"); 4 5 Thread 子线程1 = new Thread(子线程方法1); 6 Thread 子线程2 = new Thread(子线程方法2); 7 8 子线程1.Start(); 9 子线程2.Start();10 11 输出("主线程_步骤2_等待【子线程1】");12 子线程1.Join();13 //1.等待【子线程1】运行完毕,也就是等【子线程1】从【子线程方法1】里return出来。14 //2.如果【子线程1】没执行结束,也就是【子线程1】仍然在执行【子线程方法1】里的代码,则主线程会一直阻塞(等待)在这里。15 //3.如果运行这个语句之前,【子线程1】已经运行结束(从【子线程方法1】里return出来),则这个语句会立即运行完成,并且不会产生任何异常或错误。16 输出("主线程_步骤3_【子线程1】已经退出");17 18 输出("主线程_步骤4_等待【子线程2】");19 子线程2.Join();20 输出("主线程_步骤5_【子线程2】已经退出");21 22 输出("主线程_步骤6_运行完毕");23 }24 25 function 子线程方法1()26 {27 休息(1秒);//Thread.Sleep(1000)28 输出("子线程1_步骤1_开始运行");29 休息(1秒);30 休息(1秒);31 休息(1秒);32 休息(1秒);33 休息(1秒);34 输出("子线程1_步骤1_运行完毕");35 }36 37 function 子线程方法2()38 {39 休息(1秒);40 休息(1秒);41 输出("子线程2_步骤1_开始运行");42 休息(1秒);43 输出("子线程2_步骤1_运行完毕");44 }45 46 程序运行结果:47 输出:主线程_步骤1_准备执行子线程48 输出:主线程_步骤2_等待【子线程1】49 50 输出:子线程1_步骤1_开始运行51 输出:子线程2_步骤1_开始运行52 输出:子线程2_步骤1_运行完毕53 输出:子线程1_步骤1_运行完毕54 55 输出:主线程_步骤3_【子线程1】已经退出56 输出:主线程_步骤4_等待【子线程2】57 输出:主线程_步骤5_【子线程2】已经退出58 59 输出:主线程_步骤6_运行完毕
2.利用AutoResetEvent事件通知,实现1个主线程与1个子线程之间的同步
1 private static AutoResetEvent ThreadEvent = new AutoResetEvent(false);//子线程必须等待主线程发出事件后,才能执行 2 3 4 5 private static void MainThread() 6 7 { 8 9 Thread newThread = new Thread(Program.NewThreadFunction);10 Console.WriteLine("Main Thread :Start new thread");11 12 newThread.Start();13 14 Thread.Sleep(5000);//休息5秒15 16 Console.WriteLine("Main Thread :Allow new thread continue");17 18 ThreadEvent.Set();//允许子线程继续运行19 20 Console.ReadKey(true);21 22 }23 24 25 26 private static void NewThread()27 28 {29 30 Console.WriteLine("New Thread :Start, Wait for Main Thread event");31 32 ThreadEvent.WaitOne();//如果主线程不执行ThreadEvent.Set();则子线程会一直阻塞(卡)在这里33 34 Console.WriteLine("New Thread :Continue");35 36 }37 38 运行结果:39 40 输出:Main Thread :Start new thread41 42 输出:New Thread :Start, Wait for Main Thread event43 44 输出:Main Thread :Allow new thread continue45 46 输出:New Thread :Continue