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如何等待子线程执行结束
工作中往往会遇到异步去执行某段逻辑, 然后先处理其他事情, 处理完后再把那段逻辑的处理结果进行汇总的产景, 这时候就需要使用线程了. 一个线程启动之后, 是异步的去执行需要执行的内容的, 不会影响主线 ...
随机推荐
- 机器学习基石笔记:Homework #2 decision stump相关习题
原文地址:http://www.jianshu.com/p/4bc01760ac20 问题描述 程序实现 17-18 # coding: utf-8 import numpy as np import ...
- logback将日志写入不同文件夹里
转载:logback不同业务的日志打印到不同文件 一.logback.xml文件配置如下: <?xml version="1.0" encoding="UTF-8& ...
- PHP面试系列 之Linux(五)---- 案例
题:如何实现每天0点重新启动服务器? 答: (1)创建定时任务,并进行编辑 crontab -e (2)编写脚本内容 * * * reboot 0分 0时 每日 每月 每周 执行的命令:reb ...
- 下载RPM常用网址
网址一:http://www.rpm-find.net/linux/rpm2html/search.php 网址二:http://rpmfind.net/linux/rpm2html/search ...
- oracle查询用户的权限
DBA_* 描述的是数据库中的所有对象 ALL_* 描述的是当前用户有访问权限的所有对象 USER_* 描述的是当前用户所拥有的所有对象 查看所有用户: select * from dba_user ...
- 转:SQLServer中的GROUPING,ROLLUP和CUBE
转自:https://www.cnblogs.com/nikyxxx/archive/2012/11/27/2791001.html 聚集函数:GROUPING 用于汇总数据用的运算符: ROLLUP ...
- mysql5.7关于使用到OR是否会用到索引并提高查询效率的探讨
相信很多人在mysql中看到了where条件中使用到了or就会以为这样是不会走索引的,通常会使用union all或者in 来进行优化,事实并不是想象的这样具体问题具体分析. 下面我们来看看 首先我们 ...
- [已解决]Vistual Stdio 2015 installer Bootstrapper Packages 路径
VS2015 installer 的预装包的地址变更成 C:\Program Files (x86)\Microsoft Visual Studio 14.0\SDK\Bootstrapper\Pac ...
- MongoDB DBA 实践7-----MongoDB的分片集群操
一.使用Ranged Sharding对集合进行分片 从mongo连接到的shell中mongos,使用该sh.shardCollection()方法对集合进行分片. 注意: 必须已为集合所在的数据库 ...
- 树莓派3B+学习笔记:10、使用SSH连接树莓派
SSH(Secure Shell)是一种能够以安全的方式提供远程登录的协议,也是目前远程管理Linux系统的首选方式. 1.开启树莓派3B+的SSH远程管理功能,在终端中输入以下命令: sudo ra ...