最新要闻
- 全球热推荐:今天春分白昼长了!全国春日地图出炉 看看春天到哪了
- 天天热议:汽车界“海底捞服务”!蔚来2023无忧服务发布:11600元/年
- 世界聚焦:重庆不再实行旧车置换:直接给予新车补贴 总计达3000万
- 世界报道:跨界做智能手表 比亚迪回应:消息属实 4月上新
- 对标《原神》!二次元开放世界游戏《鸣潮》开启测试招募
- 每日视点!海关总署:2月下旬以来我国出口用箱量持续增长
- 国产纯电跑车前途K50美国秽土转生:换了名称、LOGO还没变
- 全球最新:40万级领先行业两代 赵长江:腾势N7月销量将轻松破万 抢夺BBA用户
- 【全球速看料】沙县小吃旗舰店包间最低消费300元 网友:吃的完吗?
- 全球头条:英国小镇被巨型老鼠入侵:像猫一样大 悬崖都要被挖塌了
- 天天观天下!广东人睡觉时间全国最晚:“打工人”平均睡眠时长7.5小时
- 一根USB线就能偷走韩系车!现代、起亚已开始免费送车主方向盘锁
- 今日关注:再不发力就晚了!新一代奥迪Q5效果图曝光:内外大变革
- 当前时讯:沙尘暴黄色预警:北方超10省将迎来大范围沙尘天气
- 环球热点评!昔日巨头彻底退场!爱普生宣布所有相机明年终止官方服务
- 西部证券:3月20日融资买入1459.71万元,融资融券余额12.72亿元
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
面试常考:C#用两个线程交替打印1-100的五种方法
"C#用两个线程交替打印1-100的五种方法"是.NET工程师面试多线程常考的试题之一,主要考察对C#语法和对多线程的熟悉程度。本文将用5种方法实现这个面试题。
(资料图片仅供参考)
方法1:使用Mutex或lock
这种方法涉及使用Mutex或lock对象来同步两个线程。其中一个线程负责打印偶数,另一个线程负责打印奇数。线程在执行任务之前会锁定共享的Mutex或lock对象,以确保每个线程执行任务时只有一个线程能够访问共享资源。代码如下:
class Program{ static Mutex mutex = new Mutex(); static int count = 1; static void Main(string[] args) { Thread t1 = new Thread(PrintOddNumbers); Thread t2 = new Thread(PrintEvenNumbers); t1.Start(); t2.Start(); t1.Join(); t2.Join(); Console.ReadLine(); } static void PrintOddNumbers() { while (count <= 100) { mutex.WaitOne(); if (count % 2 == 1) { Console.WriteLine("Thread 1: " + count); count++; } mutex.ReleaseMutex(); } } static void PrintEvenNumbers() { while (count <= 100) { mutex.WaitOne(); if (count % 2 == 0) { Console.WriteLine("Thread 2: " + count); count++; } mutex.ReleaseMutex(); } }}
方法2:使用AutoResetEvent
AutoResetEvent是一种线程同步机制,允许一个线程等待另一个线程发出信号来继续执行。其中一个线程负责打印奇数,另一个线程负责打印偶数。当一个线程完成打印任务时,它发出信号以唤醒另一个线程来继续执行。
class Program{ static AutoResetEvent oddEvent = new AutoResetEvent(false); static AutoResetEvent evenEvent = new AutoResetEvent(false); static int count = 1; static void Main(string[] args) { Thread t1 = new Thread(PrintOddNumbers); Thread t2 = new Thread(PrintEvenNumbers); t1.Start(); t2.Start(); t1.Join(); t2.Join(); Console.ReadLine(); } static void PrintOddNumbers() { while (count <= 100) { if (count % 2 == 1) { Console.WriteLine("Thread 1: " + count); count++; evenEvent.Set(); oddEvent.WaitOne(); } } } static void PrintEvenNumbers() { while (count <= 100) { if (count % 2 == 0) { Console.WriteLine("Thread 2: " + count); count++; oddEvent.Set(); evenEvent.WaitOne(); } } }//欢迎关注公众号“DOTNET开发跳槽”,关注可获得海量面试题
方法3:使用Monitor
Monitor是C#中的一种同步机制,类似于Mutex。其中一个线程负责打印奇数,另一个线程负责打印偶数。线程在执行任务之前会锁定共享的Monitor对象,以确保每个线程执行任务时只有一个线程能够访问共享资源。
class Program{ static object lockObj = new object(); static int count = 1; static void Main(string[] args) { Thread t1 = new Thread(PrintOddNumbers); Thread t2 = new Thread(PrintEvenNumbers); t1.Start(); t2.Start(); t1.Join(); t2.Join(); Console.ReadLine(); } static void PrintOddNumbers() { while (count <= 100) { lock (lockObj) { if (count % 2 == 1) { Console.WriteLine("Thread 1: " + count); count++; } } } } static void PrintEvenNumbers() { while (count <= 100) { lock (lockObj) { if (count % 2 == 0) { Console.WriteLine("Thread 2: " + count); count++; } } } }}
方法4:使用信号量Semaphore
Semaphore是一种同步机制,允许多个线程同时访问共享资源。其中一个线程负责打印奇数,另一个线程负责打印偶数。线程在执行任务之前会等待信号量,以确保每个线程只有在获得信号量之后才能访问共享资源。
class Program{ static Semaphore semaphore = new Semaphore(1, 1); static int count = 1; static void Main(string[] args) { Thread t1 = new Thread(PrintOddNumbers); Thread t2 = new Thread(PrintEvenNumbers); t1.Start(); t2.Start(); t1.Join(); t2.Join(); Console.ReadLine(); } static void PrintOddNumbers() { //注意 这里是99,否则会出现101 while (count <= 99) { semaphore.WaitOne(); if (count % 2 == 1) { Console.WriteLine("Thread 1: " + count); count++; } semaphore.Release(); } } static void PrintEvenNumbers() { while (count <= 100) { semaphore.WaitOne(); if (count % 2 == 0) { Console.WriteLine("Thread 2: " + count); count++; } semaphore.Release(); } }}
方法5:使用Task和async/await
在C#中,使用Task和async/await关键字可以轻松地在两个线程之间切换执行。其中一个线程负责打印奇数,另一个线程负责打印偶数。线程在执行任务之前使用async/await等待异步任务完成,以确保每个线程只在异步任务完成后才访问共享资源。
class Program{ static int count = 1; static void Main(string[] args) { Task.Run(PrintOddNumbers); // 这里改成这个也可以 // var thread1 = new Thread(PrintOddNumbers); Task.Run(PrintEvenNumbers); Console.ReadLine(); } //如果用Thread改成同步方法 static async Task PrintOddNumbers() { while (count <= 100) { if (count % 2 == 1) { Console.WriteLine("Thread 1: " + count); count++; //如果用Thread这里改成 Thread.Sleep(1); await Task.Delay(1); } } } static async Task PrintEvenNumbers() { while (count <= 100) { if (count % 2 == 0) { Console.WriteLine("Thread 2: " + count); count++; await Task.Delay(1); } } }//欢迎关注公众号“DOTNET开发跳槽”,关注可获得海量面试题
五种效果如下:
以上五种方法各有优缺点,没有一种方法是绝对最优的,取决于应用场景和要求。以下是对五种方法的简单比较和说明:1、使用ManualResetEventWaitHandle:这种方法在实现上较为简单,但是由于线程必须互斥地访问共享资源,因此会导致性能瓶颈。此外,使用ManualResetEventWaitHandle需要频繁调用WaitOne和Set方法,可能会降低应用程序的响应能力。2、使用AutoResetEventWaitHandle:这种方法在实现上比较简单,而且使用AutoResetEventWaitHandle可以避免性能瓶颈问题。然而,它仍然需要频繁调用WaitOne和Set方法,可能会降低应用程序的响应能力。3、使用锁:使用锁可以避免性能瓶颈问题,因为同一时间只有一个线程可以访问共享资源。但是,锁可能会导致线程死锁和性能下降的问题,因此需要小心使用。4、使用信号量Semaphore:这种方法可以避免性能瓶颈问题,并允许多个线程同时访问共享资源。Semaphore还可以设置多个许可证,以控制并发线程的数量。然而,使用Semaphore可能会使代码变得更加复杂,因此需要小心使用。5、使用Task和async/await:这种方法可以避免性能瓶颈问题,并且使用Task和async/await可以使代码更加简洁易懂。但是,它可能会对内存和CPU产生额外的开销,因为需要在任务之间频繁地切换上下文。综上所述,选择哪种方法取决于应用程序的要求和程序员的个人偏好。如果应用程序需要更好的性能,则应该使用锁或信号量;如果应用程序需要更简洁易懂的代码,则应该使用Task和async/await。考察的知识点
1、C#编程语言和语法:实现多线程程序需要熟悉C#编程语言和语法,包括线程的创建和管理、共享资源的访问和同步等方面的知识。2、多线程编程:多线程编程是指同时运行多个线程的编程模型,它可以提高应用程序的性能和响应能力。多线程编程需要考虑线程的同步、共享资源的访问、线程间的通信等问题。3、线程同步机制:线程同步机制是指用于控制多个线程访问共享资源的机制,常用的线程同步机制包括锁、信号量、事件等。4、异步编程:异步编程是指不阻塞线程并且在完成任务后通知线程的编程模型,它可以提高应用程序的响应能力和性能。异步编程需要熟悉异步和await关键字、Task和Task关键词:
面试常考:C#用两个线程交替打印1-100的五种方法
全球新资讯:Paramiko_Linux
【全球独家】跟着字节AB工具DataTester,5步开启一个实验
英雄联盟自动关闭是什么意思?英雄联盟自动关闭怎么解决?
冒险岛的时空裂缝是什么?冒险岛怎么提升面板?
全球热推荐:今天春分白昼长了!全国春日地图出炉 看看春天到哪了
天天热议:汽车界“海底捞服务”!蔚来2023无忧服务发布:11600元/年
世界聚焦:重庆不再实行旧车置换:直接给予新车补贴 总计达3000万
世界报道:跨界做智能手表 比亚迪回应:消息属实 4月上新
对标《原神》!二次元开放世界游戏《鸣潮》开启测试招募
热点!如果设备不支持vulkan,就用swiftshader,否则就加载系统的vulkan的正确姿势(让程序能够智能的在vulkan-1.dll和libvk_s
【全球快播报】springboot使用easyExcel导出Excel表格以及LocalDateTime时间类型转换问题
《前端serverless 面向全栈的无服务器架构实战》读书笔记
每日视点!海关总署:2月下旬以来我国出口用箱量持续增长
国产纯电跑车前途K50美国秽土转生:换了名称、LOGO还没变
全球最新:40万级领先行业两代 赵长江:腾势N7月销量将轻松破万 抢夺BBA用户
【全球速看料】沙县小吃旗舰店包间最低消费300元 网友:吃的完吗?
全球头条:英国小镇被巨型老鼠入侵:像猫一样大 悬崖都要被挖塌了
OpenGL 图像 lookup 色彩调整
天天时讯:剑指 Offer 07. 重建二叉树(java解题)
为什么Redis不直接使用C语言的字符串?看完直接吊打面试官!
天天观天下!广东人睡觉时间全国最晚:“打工人”平均睡眠时长7.5小时
一根USB线就能偷走韩系车!现代、起亚已开始免费送车主方向盘锁
今日关注:再不发力就晚了!新一代奥迪Q5效果图曝光:内外大变革
当前时讯:沙尘暴黄色预警:北方超10省将迎来大范围沙尘天气
环球热点评!昔日巨头彻底退场!爱普生宣布所有相机明年终止官方服务
环球关注:论文解读TCPN
西部证券:3月20日融资买入1459.71万元,融资融券余额12.72亿元
环球速讯:中国罐头在海外多国热销:成为香饽饽
天天讯息:大反转!南京大学团队推翻美室温超导技术 复刻实验没发现超导现象
天天速看:又一致命真菌爆发:已遍布美国一半以上的州
天天微动态丨OPPO Find X6系列外观公布:拼接设计、后摄巨大
比亚迪汉唐冠军版发布会高能金句感受下 合资燃油车瑟瑟发抖
MAUI Blazor 加载本地图片的解决方案
每日热点:朴素系统优化思维的实践
焦点热文:债券通北向通2月成交规模环比增超三成 政金债跃升为最活跃券种
今日热讯:LCD荣光犹在!iQOO Z7开启预售:1599元起
全球观察:漫威后期制作总裁离职
当前通讯!2022年度个税汇算今起不用预约:多退少补你能退多少
移除雷达传感器后 特斯拉车祸数量上升:车主反映莫名刹车故障
快消息!读C#代码整洁之道笔记02_类、对象和数据结构及编写整洁函数
鲁抗医药:3月20日融资买入477.87万元,融资融券余额2.49亿元
全球速读:今年以来险企“补血”超340亿元 数百亿元补充资本“在路上”
世界观点:国际金融市场早知道:3月21日
铁矿石价格“非理性”上涨 监管层频频发声剑指价格炒作
天天最新:春分迎接春天:昼夜时间等长
2TB硬盘开车价400多 SSD便宜到没朋友:5大巨头流泪数钱
每日速递:读Java性能权威指南(第2版)笔记23_ 性能分析工具
焦点速讯:影响人类文明的“小方块” USB接口进化史
当前资讯!快来!我们发现了藏在新风空调里的“秘密”
当前速看:C++温故补缺(一):引用类型
要闻速递:【Visual Leak Detector】简介
Spotify 畅听全网高品质音乐
焦点热门:GPT-4外逃计划曝光!教授发现它正引诱人类帮助 网友:灭绝之门
天天快看点丨因禽流感爆发 阿根廷已扑杀70余万只禽类!
焦点!27款进口游戏版号获批!《赛马娘》《蔚蓝档案》等改名引热议
你相信吗?每天都有10多万人 学习流浪汉的生存技巧
环球今亮点!15年后 官方发布北京奥运福娃全新手办:五个一套440元
26种死法知乎_26种死法怎么样
天天速讯:织金县鸡场乡:防范电信诈骗,拉响反诈警报
Go 并发编程(一):协程 gorotine、channel、锁
vue和xml复习
Vue——vue2错误处理收集【七】
环球关注:iPhone开始在俄罗斯遭禁用了:不安全!苹果此前已在该国停售
焦点快看:填补空白!中国将首次开启海上二氧化碳封存
C# 探秘如何优雅的终止线程
行人车辆检测与计数系统(Python+YOLOv5深度学习模型+清新界面)
焦点播报:Spring IOC官方文档学习笔记(十四)之ApplicationContext的其他功能
如何上传一个npm包
中债金融终端上线“货币经纪行情”功能
瑞信风波由股及债 此前已有分析师提示“AT1”风险
Wii U和3DS在线游戏商店关闭前:玩家花15万328天买下所有游戏
2022年 全国坐火车的少了36.4%!高铁已达4.2万公里
环球热点!基于深度学习的口罩检测系统(Python+清新界面+数据集)
【环球新视野】自律|坚持,是因为不喜欢
Java内部类笔记整理
全球快资讯丨永磁同步电机驱动系统—相关方向思考
焦点要闻:HTTP 状态码与课程总结
日本东电直播用核污水养鱼 海外网友直言:留着自己吃吧
环球热点评!旗舰级LCD护眼屏+120W独此一款!iQOO Z7发布:1599元
全球热议:6000mAh同档位续航无敌!iQOO Z7x发布:1299元起
便宜卡终于有了!好队友抢跑:RTX 4070/4060来也
9999元 AOC爱攻新款48寸显示器上架:4K OLED屏、138Hz高刷
当前快讯:死亡细胞将登陆Android端
环球快看点丨波动数列
瑞银收购瑞信意外“引爆”AT1债券市场 对冲基金不计成本抛售避险
【世界新视野】抗早泄药物盐酸达泊西汀国内正式上市:效果最好!订单超4000万元
天天通讯!1994《小美人鱼》vs2023《小美人鱼》对比图火了:5月上映 你会看吗?
焦点消息!LCD党最好的选择!iQOO Z7定制旗舰级LCD屏:超级护眼
今日热闻!神秘光点划过美国加州夜空 专家:或为日本太空垃圾
【世界新要闻】正式签约石墨烯之父 超威电池三大单品发布
世界今热点:Python+selenium安装
全球即时看!【财经分析】“降准”落地利好信用债阶段表现 中期仍需关注多因素扰动风险
网传凯迪拉克中控屏行驶中弹窗广告 车主:烦死了
热点!多益网络:前女高管们利用网络水军造假 导致公司损失5亿元
全球即时看!速干短袖+短裤:骆驼运动套装79元狂促(300元大额券)
戴森空气净化耳机首发体验:6699元图一乐?
美知名媒体曝特斯拉大量负面:自动驾驶测试作假
焦点速看:这些AIGC工具有趣且实用
abc294G