C# 多线程的等待所有线程结束的一个问题
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
using System;using System.Threading;namespace ConsoleApplication1{ class Program { private static AutoResetEvent[] events; static void Main(string[] args) { int threadNum = 10; Thread[] thread = new Thread[threadNum]; events = new AutoResetEvent[threadNum]; for (int i = 0; i < threadNum; i++) { var waithandler = new AutoResetEvent(false); events[i] = waithandler; ThreadStart starter = delegate { var param = new Tuple<string, AutoResetEvent>("test print:" + i, waithandler); Print(param); }; thread[i] = new Thread(starter) { Name = "thread" + i.ToString() }; } for (int i = 0; i < threadNum; i++) { thread[i].Start(); } WaitHandle.WaitAll(events); Console.WriteLine("Completed!"); Console.Read(); } private static void Print(object param) { var p = (Tuple<string, AutoResetEvent>)param; Console.WriteLine(Thread.CurrentThread.Name + ": Begin!"); Console.WriteLine(Thread.CurrentThread.Name + ": Print" + p.Item1); Thread.Sleep(300); Console.WriteLine(Thread.CurrentThread.Name + ": End!"); p.Item2.Set(); } }} |
一次性地Set,其实使用ManualResetEvent就足够了。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
using System;using System.Collections.Generic;using System.Threading;namespace ConsoleApplication1{ class Program { static void Main(string[] args) { var waits = new List<EventWaitHandle>(); for (int i = 0; i < 10; i++) { var handler = new ManualResetEvent(false); waits.Add(handler); new Thread(new ParameterizedThreadStart(Print)) { Name = "thread" + i.ToString() }.Start(new Tuple<string, EventWaitHandle>("test print:" + i, handler)); } WaitHandle.WaitAll(waits.ToArray()); Console.WriteLine("Completed!"); Console.Read(); } private static void Print(object param) { var p = (Tuple<string, EventWaitHandle>)param; Console.WriteLine(Thread.CurrentThread.Name + ": Begin!"); Console.WriteLine(Thread.CurrentThread.Name + ": Print" + p.Item1); Thread.Sleep(300); Console.WriteLine(Thread.CurrentThread.Name + ": End!"); p.Item2.Set(); } }} |
C# 多线程的等待所有线程结束的一个问题的更多相关文章
- C# 多线程的等待所有线程结束
//前台线程和后台线程唯一区别就是:应用程序必须运行完所有的前台线程才可以退出://而对于后台线程,应用程序则可以不考虑其是否已经运行完毕而直接退出,//所有的后台线程在应用程序退出时都会自动结束 ...
- CountDownLatch 多线程,等待所有线程结束
CountDownLatch,一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待. 主要方法 public CountDownLatch(int count); 构造 ...
- C# 多线程的等待所有线程结束 用 ManualResetEvent 控制
using System; using System.Collections.Generic; using System.Threading; namespace ConsoleApplication ...
- Java多线程之以7种方式让主线程等待子线程结束
记一次主线程等待子线程结束的多种方法的学习 在学习多线程时,最开始遇到的问题其实是"计算子线程运行时间",写到最后发现本文和标题更为符合,但是仍然基于问题:"在主线程中获 ...
- java 多线程 Thread.join子线程结束父线程再运行;join(long):等待超时毫秒数
Join的使用 目的:当子线程运行结束后,父线程才能再继续运行 /** * @ClassName ThreadJoinExample * @projectName: object1 * @author ...
- Java Thread.join()详解--父线程等待子线程结束后再结束
目录(?)[+] 阅读目录 一.使用方式. 二.为什么要用join()方法 三.join方法的作用 join 四.用实例来理解 打印结果: 打印结果: 五.从源码看join()方法 join是Th ...
- Java 并发编程中的 CountDownLatch 锁用于多个线程同时开始运行或主线程等待子线程结束
Java 5 开始引入的 Concurrent 并发软件包里面的 CountDownLatch 其实可以把它看作一个计数器,只不过这个计数器的操作是原子操作,同时只能有一个线程去操作这个计数器,也就是 ...
- 线程:Java主线程等待子线程结束
使用Thread.join()方法: public class App { public static void main(String[] args) { testMain(); } public ...
- Java如何等待子线程执行结束
工作中往往会遇到异步去执行某段逻辑, 然后先处理其他事情, 处理完后再把那段逻辑的处理结果进行汇总的产景, 这时候就需要使用线程了. 一个线程启动之后, 是异步的去执行需要执行的内容的, 不会影响主线 ...
随机推荐
- 如何彻底修改eclipse中的名称
一.右键工程:Refactor->Rename,或选中工程按F2,修改名称二.修改项目目录下:.project文件 <?xml version="1.0" encodi ...
- cocos2d-x开发: 完善接口范例分离模块
在上一篇文章中,我阐述了一下为什么要做分离这种工作,这篇文章没什么重点,只是将上一次没有完善的工作做完.原本我想做到像Lua-tests那样子,能够一次完全显示所有的tests,然后选择要执行的tes ...
- 安装Win7时删除系统保留的100M隐藏分区
原创文章,作者:lenbs,如若转载,请注明出处:https://www.smbinn.com/delwindows7100m.html 安装windows7新建磁盘分区时系统会自动创建100M的保留 ...
- mvc.net路由中带特殊字符如【.*/\】等时遇到的天坑
用mvc.net的路由做网站伪静态时出现的天坑,自己一直没测试出来,竟然要靠客户被坑了后才知道 解决办法 参考https://stackoverflow.com/questions/16581184/ ...
- npm run build 时报错operation not permitted
1.项目使用vue框架,在npm run build 打包时报错: 访问对应的目录,发现无法打开,原来是文件被其他应用程序占用了,仔细看了一下,xftp文件传输的软件打开着,把它关闭以后,重新运行np ...
- 修复支付宝后台报错session IP change to many
在项目的web.xml 中添加: <init-param> <param-name>sessionStatEnable</param-name> <param ...
- Redis推荐阅读笔记整理
Herrt灬凌夜 https://www.cnblogs.com/wuyx/archive/2018/03.html 6. Redis_常用5大数据类型简介 5. redis_安装 4. Red ...
- Linux CentOS Python开发环境搭建教程
CentOS安装Python 1.CentOS已经自带安装了2.x版本,先尝试python命令检查已安装的版本.如果你使用rpm.yum或deb命令安装过,请使用相对命令查询. 2.复制安装文件链 ...
- jade
https://github.com/webpack/jade-loader http://jade-lang.com/demo/
- 20155220 2016-2017-2《java程序设计》第三周学习总结
教材学习内容总结 1.注意java与c语言的区别,在java中,数组是一个对象. 2.了解java.util.Scanner和java.math.BigDecimal这两个标准类 3.System.a ...