C#简单线程同步例子
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 thread 41 42 输出:New Thread :Start, Wait for Main Thread event 43 44 输出:Main Thread :Allow new thread continue 45 46 输出:New Thread :Continue