博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
怎么判断ThreadPool线程池里的任务都执行完毕
阅读量:6983 次
发布时间:2019-06-27

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

ThreadPool 判断子线程全部执行完毕的四种方法 1、先来看看这个 多线程编程 多线程用于数据采集时,速度明显很快,下面是基本方法,把那个auto写成采集数据方法即可。 using System; using System.Collections.Generic; using System.Text; using System.Threading; namespace ConsoleApplication1 {
class Program {
static void Main(string[] args) {
try {
ThreadPool.SetMaxThreads(3, 3); //设置最大线程数 for (int i = 0; i < 10; i++) {
ThreadPool.QueueUserWorkItem(new WaitCallback(Auto), i);//线程池指定线程执行Auto方法 } Console.ReadLine(); } catch (Exception ex) {
Console.WriteLine(ex.Message); } } public static void Auto(object i)//多线程执行的方法 {
if (string.Equals(i,2)) {
Thread.Sleep(2000); } Console.WriteLine(i.ToString()); } } } 明白吧,就是多线程执行顺序是不确定的。 2、再来看看这个结果 static void Main(string[] args) {
try {
ThreadPool.SetMaxThreads(3, 3); //设置最大线程数 for (int i = 0; i < 10; i++) {
ThreadPool.QueueUserWorkItem(new WaitCallback(Auto), i);//线程池指定线程执行Auto方法 } } catch (Exception ex) {
Console.WriteLine(ex.Message); } Console.WriteLine("结束了"); //这句要改 Console.ReadLine(); } public static void Auto(object i)//多线程执行的方法 {
if (string.Equals(i, 2)) {
Thread.Sleep(2000); } Console.WriteLine(i.ToString()); } 结束了 这三个字不一定 真正在 最后一行输出。因为这时是 主线程+子线程 这些线程的执行顺序不确定,可能主线程老早就执行了。也就说可能结束了 这三个字很早就会输出。 3、主题 保证 结束了 在最后输出。 方法1: //这是主线程,一直都会执行。目前一直在进行的是 一个主线程+多个子线程 while (true) {
Thread.Sleep(1000);//这句写着,主要是没必要循环那么多次。去掉也可以。 int maxWorkerThreads, workerThreads; int portThreads; ThreadPool.GetMaxThreads(out maxWorkerThreads, out portThreads); ThreadPool.GetAvailableThreads(out workerThreads, out portThreads); if (maxWorkerThreads - workerThreads == 0) {
Console.WriteLine("结束了"); break; } } GetAvailableThreads():检索由 GetMaxThreads 返回的线程池线程的最大数目和当前活动数目之间的差值。 而GetMaxThreads 检索可以同时处于活动状态的线程池请求的数目。 通过最大数目减可用数目就可以得到当前活动线程的数目,如果为零,那就说明没有活动线程,说明所有线程运行完毕。 方法2 : Monitor 见下篇文章: class Program {
static object locker = new object(); static int runningThreads = 0; static void Main(string[] args) {
try {
ThreadPool.SetMaxThreads(4, 4); //设置最大线程数 using System.Threading; runningThreads = 10; for (int i = 0; i < runningThreads; i++) {
ThreadPool.QueueUserWorkItem(new WaitCallback(Auto), i);//线程池指定线程执行Auto方法 } } catch (Exception ex) {
Console.WriteLine(ex.Message); } lock (locker) {
while (runningThreads > 0) {
Monitor.Wait(locker); } } Console.WriteLine("结束了"); Console.ReadLine(); } public static void Auto(object i)//多线程执行的方法 {
if (string.Equals(i, 2)) {
Thread.Sleep(2000); } lock (locker) {
runningThreads--; Monitor.Pulse(locker); } Console.WriteLine(i.ToString()); } } 方法3:WaitHandle (推荐用这个方法) 。 public void testThreads() {
ManualResetEvent[] _ManualEvents = new ManualResetEvent[10]; for (int i = 0; i < 10; i++) {
_ManualEvents[i] = new ManualResetEvent(false); System.Threading.ThreadPool.QueueUserWorkItem(new WaitCallback(testMethod), _ManualEvents[i]); } WaitHandle.WaitAll(_ManualEvents); // 线程结束后执行后面的主线程代码 Console.WriteLine("结束了"); Console.ReadLine(); } public void testMethod(object objEvent) {
//TODO: Add your code here ManualResetEvent e = (ManualResetEvent)objEvent; e.Set(); }

转载地址:http://uwtpl.baihongyu.com/

你可能感兴趣的文章
SpringBoot基础篇配置信息之配置刷新
查看>>
第十一天:find
查看>>
golang sync WaitGroup
查看>>
使用graphite和grafana进行应用程序监控
查看>>
github推送错误:已经有此代码,不允许覆盖的解决方法
查看>>
C#MysqlHelper
查看>>
SpringMVC Hello World 实例
查看>>
MySQL BETWEEN 用法
查看>>
vim开启自动缩进
查看>>
【转】js之iframe子页面与父页面通信
查看>>
java设计模式_模版模式
查看>>
摄像机平滑更随脚本
查看>>
Struts2 标签配置详细
查看>>
需求管理工具比较 Doors_Requistie Pro_RDM
查看>>
centos+php+nginx的php.ini无法加载的问题
查看>>
从菜鸟到专家的五步编程语言学习法
查看>>
RequestQueue
查看>>
Android TextView 属性设置
查看>>
html元素分类以及嵌套规则
查看>>
android dpi
查看>>