C# 线程同步与线程池 浅析【C#.Net教程】,C#,线程同步,线程池
作者:搜教程发布时间:2019-11-27分类:.Net教程浏览:40评论:0
示例很简单,预备5个线程,每一个线程同时向控制台输出数字,然后视察输出效果。
代码申明:
////线程列表
private static List<Thread> _threadList; static voidMain(string[] args) { Program._threadList= new List<Thread>(); ////附加5个线程 for (inti = 0; i < 5; i++) { Program.AppendThread(); } ////最先实行一切测试线程 Program.ExecuteThread(); ////按任意键退出 Console.ReadLine(); } /// <summary> /// 将新的测试线程附加到测试线程列表,线程实行逻辑就是输出10个数字 /// 注重初始化的时刻设置为背景线程了,如许可以保证主线程退出的时刻其他线/// 程自动退出 /// </summary> public staticvoid AppendThread() { Program._threadList.Add(newThread(new ThreadStart( () => { for (int i = 0; i < 10; i++) { Console.WriteLine(i); } })){ IsBackground = true }); } /// <summary> /// 最先实行一切测试线程 /// </summary> public staticvoid ExecuteThread() { foreach(Thread t in _threadList) { t.Start(); } }
视察实行效果,我们可以看到效果以下:
依据效果(数字的输出是不规律的)可知,线程之间发生了滋扰。战略就是,加一个同步成员来举行线程同步:
/// <summary> /// 多线程同步的对象 /// </summary> private static object _syncObj = new object(); 别的,在线程实行的处所加锁: Program._threadList.Add(newThread(new ThreadStart( () => { lock (_syncObj) { for (int i = 0; i < 10;i++) { Console.WriteLine(i); } } })) { IsBackground = true });
视察效果:
可以看到经由过程Lock关键字,对一个多线程同步的变量加锁确实可以使得线程同步。
如今看一下第二种体式格局:
运用monitor关键字举行同步,代码:
Monitor.Enter(_syncObj); try { for (int i = 0; i < 10; i++) { Console.WriteLine(i); } } finally { Monitor.Exit(_syncObj); }
检察效果,会发明线程已同步了。
第三种体式格局:
如今让我们重构一下代码,新建一个ThreadManager的类,把类的职责都搬进去:
class ThreadManager { /// <summary> /// 线程列表 /// </summary> private staticList<Thread> _threadList; staticThreadManager() { _threadList = new List<Thread>(); } /// <summary> /// 附加新线程 /// </summary> public staticvoid AppendThread() { ThreadManager._threadList.Add(newThread(new ThreadStart( () => { for (int i = 0; i < 10; i++) { Console.WriteLine(i); } })){ IsBackground = true }); } /// <summary> /// 最先实行一切线程 /// </summary> public staticvoid ExecuteThread() { foreach(Thread t in _threadList) { t.Start(); } } }
Main函数挪用的代码做响应的转变:
static voidMain(string[] args) { ////附加5个线程 for (int i = 0; i < 5; i++) { ThreadManager.AppendThread(); } ////最先测试 ThreadManager.ExecuteThread(); ////按任意键继承 Console.ReadLine(); }
因为没有对线程同步做任何处置惩罚,效果一定可以猜到,线程是不同步的:
如今对ThreadManager这个类加上特征:[Synchronization],再次运转之,发明线程同步了,这就是线程同步的第四种计划,用起来很简单,然则起首它请求实行逻辑都放在一个类中,因为它可以确保这个类中的一切要领都是线程平安的,因而它的机能相对低效。
线程同步另有要领吗?答案是一定的,那就是第四种要领—线程池。
如今来看一下如何用线程池来完成:
static void Main(string[]args) { /////定义一个waitCallback对象,并定义它的行动,就是向控制台输出十个数字同时可以通报/////一个参数(这个参数是可选的) WaitCallback work = new WaitCallback((o)=> { for(int i = 0; i < 10; i++) { Console.WriteLine(i); } }); ////实行5次 for (inti = 0; i < 5; i++) { /////假如这里须要通报参数,可以挪用另一个重载要领 ThreadPool.QueueUserWorkItem(work); } ////按任意键继承 Console.ReadLine(); }
如许就完成了方才的逻辑吗?是的,运转以后我们可以看到效果,线程是同步的。
多线程还带来了哪些优点?
线程池减少了线程建立、最先和住手的次数,从而提高了效力;
运用线程池,可以使我们将注重力放到营业逻辑上而不是多线程架构上(然而在某些状况应优先运用手工线程治理)
假如须要前台线程或许设置优先级别,或许线程池中的线程老是背景线程,且他的优先级是默许的;
假如须要一个带有牢固标识的线程便于退出,挂起或经由过程名字发明它。
以上就是C# 线程同步与线程池 浅析的内容,更多相关内容请关注ki4网(www.ki4.cn)!
相关推荐
- 线程池的实现方式_JAVA教程,线程池
- 什么是java线程同步【JAVA教程】,java,线程同步
- java中关于线程同步的明白【JAVA教程】,java,线程同步,理解
- java中怎样完成线程同步【JAVA教程】,java,实现,线程同步
- C#对XML读写的代码实例【XML教程】,C#,XML读写
- C#中经由过程xpath查找xml的指定元素的代码实例【XML教程】,C#,xpath,xml
- C#怎样盘算2个字符串类似度的示例代码分享【C#.Net教程】,C#,字符串,相似度
- 详解C#罕见运用函数的实例总结【C#.Net教程】,C#,应用函数
- C#剖析XML文件的代码实例分享【C#.Net教程】,C#,XML
- C# 怎样设置体系的默许打印机的简朴代码示例【C#.Net教程】,C#,打印机
你 发表评论:
欢迎- .Net教程排行
-
- 1案例分享c++ map的运用和 查找机能测试【C#.Net教程】,性能,map,c++
- 2c#怎样运用?c#的基础语法【C#.Net教程】,c#,关键字
- 3细致引见C# string花样的日期时候字符串转为DateTime范例的要领【C#.Net教程】,C#,string,DateTime
- 4详解ASP.NET中衔接数据库设置要领【C#.Net教程】,ASP.NET,数据库,配置
- 5.net和c#有什么区别【C#.Net教程】,.net,c#
- 6C# DataSet机能最好实践【C#.Net教程】,C#,DataSet
- 7asp .net 面试题及答案分享【C#.Net教程】,.net,自己,整理,问题,面试
- 8C#_挪用封装的一个类完成导出Excel表格的功用【C#.Net教程】,C# Excel表格
- 9伪代码是什么?如何写一个伪代码?【C#.Net教程】,伪代码,c语言,算法
- 最新文章
- 广而告之