C#简单线程同步例子
2013-03-15 19:47
295 查看
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 主线程继续执行剩余语句。此流程完毕。
例子:
2.利用AutoResetEvent事件通知,实现1个主线程与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 主线程继续执行剩余语句。此流程完毕。
例子:
function 主线程方法() { 输出("主线程_步骤1_准备执行子线程"); Thread 子线程1 = new Thread(子线程方法1); Thread 子线程2 = new Thread(子线程方法2); 子线程1.Start(); 子线程2.Start(); 输出("主线程_步骤2_等待【子线程1】"); 子线程1.Join(); //1.等待【子线程1】运行完毕,也就是等【子线程1】从【子线程方法1】里return出来。 //2.如果【子线程1】没执行结束,也就是【子线程1】仍然在执行【子线程方法1】里的代码,则主线程会一直阻塞(等待)在这里。 //3.如果运行这个语句之前,【子线程1】已经运行结束(从【子线程方法1】里return出来),则这个语句会立即运行完成,并且不会产生任何异常或错误。 输出("主线程_步骤3_【子线程1】已经退出"); 输出("主线程_步骤4_等待【子线程2】"); 子线程2.Join(); 输出("主线程_步骤5_【子线程2】已经退出"); 输出("主线程_步骤6_运行完毕"); } function 子线程方法1() { 休息(1秒);//Thread.Sleep(1000) 输出("子线程1_步骤1_开始运行"); 休息(1秒); 休息(1秒); 休息(1秒); 休息(1秒); 休息(1秒); 输出("子线程1_步骤1_运行完毕"); } function 子线程方法2() { 休息(1秒); 休息(1秒); 输出("子线程2_步骤1_开始运行"); 休息(1秒); 输出("子线程2_步骤1_运行完毕"); } 程序运行结果: 输出:主线程_步骤1_准备执行子线程 输出:主线程_步骤2_等待【子线程1】 输出:子线程1_步骤1_开始运行 输出:子线程2_步骤1_开始运行 输出:子线程2_步骤1_运行完毕 输出:子线程1_步骤1_运行完毕 输出:主线程_步骤3_【子线程1】已经退出 输出:主线程_步骤4_等待【子线程2】 输出:主线程_步骤5_【子线程2】已经退出 输出:主线程_步骤6_运行完毕
2.利用AutoResetEvent事件通知,实现1个主线程与1个子线程之间的同步
private static AutoResetEvent ThreadEvent = new AutoResetEvent(false);//子线程必须等待主线程发出事件后,才能执行 private static void MainThread() { Thread newThread = new Thread(Program.NewThreadFunction); Console.WriteLine("Main Thread :Start new thread"); newThread.Start(); Thread.Sleep(5000);//休息5秒 Console.WriteLine("Main Thread :Allow new thread continue"); ThreadEvent.Set();//允许子线程继续运行 Console.ReadKey(true); } private static void NewThread() { Console.WriteLine("New Thread :Start, Wait for Main Thread event"); ThreadEvent.WaitOne();//如果主线程不执行ThreadEvent.Set();则子线程会一直阻塞(卡)在这里 Console.WriteLine("New Thread :Continue"); } 运行结果: 输出:Main Thread :Start new thread 输出:New Thread :Start, Wait for Main Thread event 输出:Main Thread :Allow new thread continue 输出:New Thread :Continue
相关文章推荐
- c#用一个线程同步的简单例子
- C#网络编程简单实现通信小例子-2
- 用c#进行directX开发的一个简单例子
- c#简单的组播例子
- C#中 Queue 的简单应用例子
- C# Socket TCP简单例子(服务器与客户端通信)
- c# 编写 最简单的 webService 例子
- [转]一个简单的C#多线程间同步的例子
- c#中子线程控制进度条的一个简单例子
- 一个简单的C#多线程间同步的例子
- JAVA调用C#发布的webservice简单例子,java.lang.NoSuchMethodError: org.apache.ws.commons.schema.XmlSchemaComplexType.getAttributes()解决
- 用c#进行directX开发的一个简单例子
- 用C#输出数据到excel的最简单的例子(By kiseigo)
- 一个C#实现的最简单的委托例子
- C# Remoting的一个简单例子
- c# zedgraph控件的简单例子
- C#中This用法的简单小例子
- 一个简单的C#多线程间同步的例子
- C#编写游戏简单例子浅析
- C#操作MySQL数据库的简单例子