当前位置: 首页 > 编程日记 > 正文

c# 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

见下篇文章:http://hi.baidu.com/handboy/blog/item/681d093875d6e6cdd56225ae.html

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 (推荐用这个方法)

。http://hi.baidu.com/ganggang0217/blog/item/fe2a004ecad3acdcd0c86a67.html

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();
}

相关文章:

腾讯精选练习 50 题(Leetcode)笔记 PDF下载!

昨天在知识星球中立了一个Flag&#xff0c;第一步采取的行动就是把以前刷的“腾讯精选练习 50 题”重新梳理一下&#xff0c;就有了今天这本170多页的小册子。 这本小册子即可以作为学习数据结构与算法课程的参考资料&#xff0c;也可以作为备考计算机类研究生的备考资料。希望…

Python培训:try-except语句与else子句联合使用处理可能出现的程序异常

异常处理的主要目的是防止因外部环境的变化导致程序产生无法控制的错误&#xff0c;而不是处理程序的设计错误。因此&#xff0c;将所有的代码都用try语句包含起来的做法是不推荐的&#xff0c;try语句应尽量只包含可能产生异常的代码。Python中try-except语句还可以与else子句…

Backup Exec 2012 备份和还原活动目录(非授权还原)

延续以上两篇&#xff0c;安装配置完毕后&#xff0c;开始进行备份操作。 环境一如上篇: DC: pdc1.fengdian.info BE2012 Svr: backup.fengdian.info 本例使用BE2012对活动目录进行备份和后续的还原操作&#xff0c;通过模拟误删除DC中的两个OU及其用户账号&#xff0c;使用先…

hdu3368 Reversi

题意&#xff1a;一种翻转棋游戏&#xff0c;对当前的棋局&#xff0c;问黑子下一步最多能将几个白子翻为黑子&#xff0c;&#xff08;当前黑子与原先棋盘中的黑子的连线中间的白子会翻成黑子&#xff09; 分析&#xff1a;很简单的搜索题&#xff0c;不过一开始一直WA&#x…

有符号整型的数据范围为什么负数比正数多一个?

背景 我们先看Leetcode的这道题目&#xff1a; 标题&#xff1a;50. Pow(x, n)难度&#xff1a;中等https://leetcode-cn.com/problems/powx-n/ 实现 pow(x, n) &#xff0c;即计算 x 的 n 次幂函数。 示例 1: 输入: 2.00000, 10 输出: 1024.00000示例 2: 输入: 2.10000, 3…

UI设计培训:UI构思创意技巧和方法

想要作为一名合格的UI设计师&#xff0c;那么创意技巧和方法是非常重要的&#xff0c;很多刚入职场的新人或者是工作多年的设计师都会在创意技巧和方法上遇到瓶颈&#xff0c;下面小编为大家整理一些UI构思创意技巧和方法&#xff0c;希望能够帮助到大家。 UI设计培训&#xff…

博客园 cnblogs博客添加Google Analytics统计

在cnblogs的文章列表中只可以看到自己的每篇文章的页面浏览量&#xff0c;没有详细的统计信息。Google Analytics作为强大的统计工具&#xff0c;能得到几乎所有想要的统计信息&#xff0c;是博客不可多得的好工具&#xff0c;本文介绍如何在cnblogs博客中使用Google Analytics…

技术图文:Python 位运算防坑指南

背景 我们先看这个题目&#xff1a; 标题&#xff1a;137. 只出现一次的数字 II难度&#xff1a;中等https://leetcode-cn.com/problems/single-number-ii/ 给定一个 非空 整数数组&#xff0c;除了某个元素只出现一次以外&#xff0c;其余每个元素均出现了三次。找出那个只出…

聊聊nginx报错499问题

序本文主要来聊一下nginx的access log当中出现的499问题。 问题描述499 CLIENT CLOSED REQUESTA non-standard status code introduced by nginx for the case when a client closes the connection while nginx is processing the request. 原因服务器返回http头之前&#xff…

UI设计需要报培训班学习吗

UI设计在很多企业已经是不可或缺的一个岗位了&#xff0c;所以UI设计的发展空间是非常大的&#xff0c;想要做UI设计师&#xff0c;光靠自学是不行的&#xff0c;那么UI设计需要报培训班学习吗?来看看下面小编的详细介绍就知道了。 UI设计需要报培训班学习吗?目前学习UI设计主…

技术图文:位运算技术在求解算法题中的应用

背景 前段时间&#xff0c;在知识星球立了一个Flag&#xff0c;这是总结Leetcode刷题的第一篇图文。 在总结这篇图文的时候&#xff0c;顺便把遇到的坑写了两篇辅助的图文&#xff0c;大家可以参考一下&#xff1a; 有符号整型的数据范围为什么负数比正数多一个&#xff1f;P…

JavaScript学习系列6 充实文档的内容

JavaScript 两项基本原则渐进增强&#xff1a;你应该总是从最核心的部分&#xff0c;也就是从内容开始。应该根据内容使用标记实现良好的结构&#xff1b;然后再逐步加强这些内容。平稳退化&#xff1a;不支持JavaScript也能访问基本内容。内容&#xff1a;我们在Html文件中编辑…

mapreduce中设置自定义的输入类,进行文本解析(默认以tab键为分隔符)

job.setInputFormatClass(KeyValueTextInputFormat.class);//此时map端输入的键的内容为第一个tab键以左的内容,值得内容为第一个tab键以右的内容转载于:https://www.cnblogs.com/le-ping/p/7788973.html

如何分辨Web前端培训机构的好坏

web前端在互联网行业有着非常高的薪水和很好的前景&#xff0c;想要学习web前端的人越来越多&#xff0c;对于web前端培训机构的选择让很多人犯了难&#xff0c;那么如何分辨Web前端培训机构的好坏呢?该如何选择呢?来看看下面的详细介绍。 如何分辨Web前端培训机构的好坏? 1…

mysql dba系统学习(19)配置mysql+lvs+keeplived实现Mysql读操作的负载均衡

配置mysqllvskeeplived实现Mysql读操作的负载均衡 环境&#xff1a; test1192.168.46.131master test2192.168.46.130slave备份test库 test3调度器 1、安装与配置Keepalived 首先在节点test1、test2上安装Keepalived软件&#xff0c;软件安装非常简单。 12345678910111213[root…

技术图文:浅析 C# Dictionary实现原理

背景 对于 C# 中的 Dictionary类 相信大家都不陌生&#xff0c;这是一个 Collection(集合) 类型&#xff0c;可以通过 Key/Value (键值对) 的形式来存放数据&#xff1b;该类最大的优点就是它查找元素的时间复杂度接近 O(1)&#xff0c;实际项目中常被用来做一些数据的本地缓存…

思念水饺吃成泡沫水饺(图)思念质量门

思念再曝水饺吃出泡沫 &#xff01;思念带着“创可贴汤圆”和“泡沫水饺”“拜晚年”了&#xff0c;而失去新国标的“护身符”&#xff0c;思念这次还要找出什么样的借口为汤圆里的创可贴和水饺里的泡沫找“台阶”下呢&#xff1f;思念汤圆刚被爆吃出创可贴&#xff0c;思念水饺…

jQuery动画的显示与隐藏效果

jQuery中用于控制元素显示和隐藏效果的方法如表1所示。 表1 控制元素的显示和隐藏 在表1中&#xff0c;参数speed表示动画的速度&#xff0c;可设置为动画时长的毫秒值(如1000)&#xff0c;或预定的3种速度(slow、fast和normal);参数easing表示切换效果&#xff0c;默认效果为s…

技术图文:字典技术在求解算法题中的应用

背景 前段时间&#xff0c;在知识星球立了一个Flag&#xff0c;这是总结Leetcode刷题的第二篇图文。 在总结这篇图文的时候&#xff0c;顺便总结了 C# 中Dictionary类的实现&#xff0c;大家可以参考一下&#xff1a; 浅析 C# Dictionary实现原理 理论部分 C# 中字典的常…

[WCF REST] 解决资源并发修改的一个有效的手段:条件更新(Conditional Update)

条件获取&#xff08;Conditional Update&#xff09;可以避免相同数据的重复传输&#xff0c;进而提高性能。条件更新&#xff08;Conditional Update&#xff09;用于解决资源并发操作问题。如果我们预先获取一个资源进行修改或者删除&#xff0c;条件更新检验帮助我们确认资…

Netty 之 Zero-copy 的实现(下)

上一篇说到了 CompositeByteBuf &#xff0c;这一篇接着上篇的讲下去。 FileRegion 让我们先看一个Netty官方的example // netty-netty-4.1.16.Final\example\src\main\java\io\netty\example\file\FileServerHandler.java public void channelRead0(ChannelHandlerContext ctx…

Java中final关键字如何使用?

final变量只能赋值一次&#xff0c;赋值的方式有三种&#xff1a; 1)声明变量时直接赋值; 2)非静态成员变量在{}块中赋值&#xff0c;静态成员变量在static{}块中赋值; 3)非静态成员变量在构造方法中赋值。 final修饰类 final类不能被继承&#xff0c;因此不会有子类。final类中…

技术图文:双指针在求解算法题中的应用

背景 前段时间&#xff0c;在知识星球立了一个Flag&#xff0c;这是总结Leetcode刷题的第三篇图文。 理论部分 Python list 的源码地址&#xff1a; https://github.com/python/cpython/blob/master/Include/listobject.h https://github.com/python/cpython/blob/master/O…

【CSON原创】HTML5游戏框架cnGameJS开发实录(外部输入模块篇)

返回目录 1.为什么我们需要外部输入模块&#xff1f; 在游戏中我们常常用到类似这样的操作&#xff1a;鼠标点击某位置&#xff0c;玩家对象移动到该位置&#xff0c;或者按鼠标方向键&#xff0c;玩家向不同方向移动&#xff0c;等等。这些操作无一不用与外部输入设备打交道。…

中国科协(深圳)海外人才离岸创新创业基地源创力中心开业,主打国际创业服务...

2017年9月28日&#xff0c;由深圳市科学技术协会主办、深圳市罗湖区人民政府支持&#xff0c;深圳市源创力离岸创新中心承办的“梧桐山基地开园仪式暨梧桐湾未来论坛”于深圳举办。 据介绍&#xff0c; “中国科协&#xff08;深圳&#xff09;海外人才离岸创新创业基地”是在深…

找java培训机构如何挑选

​ java技术在互联网行业的需求率还是非常高的&#xff0c;它的发展前景非常可观&#xff0c;想要学好java技术&#xff0c;那么寻找一个好的java培训机构是非常重要的&#xff0c;那么找java培训机构如何挑选呢?来看看下面的详细介绍。 ​  找java培训机构如何挑选? 在选择…

技术图文:集合技术在求解算法题中的应用

背景 前段时间&#xff0c;在知识星球立了一个Flag&#xff0c;这是总结Leetcode刷题的第四篇图文。 理论部分 HashSet C# 语言中 HashSet<T> 是包含不重复项的无序列表&#xff0c;称为“集合(set)”。由于set是一个保留字&#xff0c;所以用HashSet来表示。 public…

sql server 2008数据导入Oracle方法

试了几种sql server数据导入Oracle的方法&#xff0c;发现还是sql server 的导入导出工具最好使。使用方法很简单&#xff0c;照着向导做就可以。不过使用中需要注意以下几点&#xff1a; 系统盘需要足够大。因为SSIS的临时文件都是生成在系统盘的&#xff0c;系统盘太小&#…

nginx+tomcat配置负载均衡集群

一、Hello world 1、前期环境准备 准备两个解压版tomcat&#xff0c;如何同时启动两个tomcat&#xff0c;方法如下&#xff1a; 首先去apache tomcat官网下载一个tomcat解压版。 解压该压缩包&#xff0c;生成n份tomcat 分别命名为 tomcat1&#xff0c;tomcat2&#xff0c; 然后…

参加UI设计培训要学多久

​ UI设计要学习的内容有很多&#xff0c;至于参加UI设计培训要学多久这个问题&#xff0c;要看你的学习能力和所在的UI设计培训机构都教些什么&#xff0c;我们来看看下面的详细介绍。 参加UI设计培训要学多久?千锋教育的课程大纲分享给大家参考学习一下&#xff1a; 阶段一&…