博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#简单线程同步例子
阅读量:4672 次
发布时间:2019-06-09

本文共 2514 字,大约阅读时间需要 8 分钟。

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

 

转载于:https://www.cnblogs.com/xxxteam/archive/2013/03/15/2962033.html

你可能感兴趣的文章
ubuntu16.04安装 java JDK8
查看>>
中兴F412光猫超级密码破解、破解用户限制、关闭远程控制、恢复路由器拨号
查看>>
sql 查询目标数据库中所有的表以其关键信息
查看>>
C# 高效率创建字符串类(StringBuilder)
查看>>
sql server 符号函数sign
查看>>
bzoj 4337 树的同构
查看>>
OPENQUERY用法以及使用需要注意的地方
查看>>
1001. Extending MyPoint class
查看>>
js使用showModalDialog,弹出一个自适应大小窗口
查看>>
[poj 3436]最大流+输出结果每条边流量
查看>>
webpack的安装
查看>>
字符流Reader和Writer
查看>>
【校招面试 之 C/C++】第33题 C++ 11新特性(四)之STL容器
查看>>
Java替代C语言的可能性
查看>>
android ListView中CheckBox错位的解决
查看>>
linux下的mongodb数据库原生操作
查看>>
BNUOJ 1268 PIGS
查看>>
菜鸟的MySQL学习笔记(三)
查看>>
商业选址5A法则
查看>>
POJ 1191 棋盘分割(区间DP)题解
查看>>