C# ThreadPool 线程池
Thread与ThreadPool
Thread: .NetFramework1.0 对线程对象的一个封装
Thread方法很多很强大,但是太过强大,而且没有限制 功能繁多,反而用不好--就像给4岁小孩一把热武器,反而会造成更大的伤害 对线程数量是没有管控的
ThreadPool:.NetFramework2.0 线程池
如果某个对象创建和销毁代价比较高,同时这个对象还可以反复使用的,就需要一个池子
保存多个这样的对象,需要用的时候从池子里面获取;用完之后不用销毁,放回池子;(享元模式)
节约资源提升性能;此外,还能管控总数量,防止滥用;
ThreadPool的线程都是后台线程
常用方法
1、GetMaxThreads(Int32, Int32) 检索可以同时处于活动状态的线程池请求的数目。 所有大于此数目的请求将保持排队状态,直到线程池线程变为可用,获取当前线程池中辅助线程的最大数目、线程池中异步 I/O 线程的最大数目
2、GetMinThreads(Int32, Int32) 发出新的请求时,在切换到管理线程创建和销毁的算法之前检索线程池按需创建的线程的最小数量
3、SetMaxThreads(Int32, Int32) 设置可以同时处于活动状态的线程池的请求数目。 所有大于此数目的请求将保持排队状态,直到线程池线程变为可用
4、SetMinThreads(Int32, Int32) 发出新的请求时,在切换到管理线程创建和销毁的算法之前设置线程池按需创建的线程的最小数量
{
ThreadPool.GetMaxThreads(out int workerThreads, out int completionPortThreads);
Console.WriteLine($"当前电脑最大workerThreads={workerThreads} 最大completionPortThreads={completionPortThreads}");
ThreadPool.GetMinThreads(out int workerThreadsMin, out int completionPortThreadsMin);
Console.WriteLine($"当前电脑最小workerThreads={workerThreadsMin} 最大completionPortThreads={completionPortThreadsMin}");
//设置的线程池数量是进程全局的,
//委托异步调用--Task--Parrallel--async/await 全部都是线程池的线程
//直接new Thread不受这个数量限制的(但是会占用线程池的线程数量)
ThreadPool.SetMaxThreads(, );//设置的最大值,必须大于CPU核数,否则设置无效
ThreadPool.SetMinThreads(, );
Console.WriteLine("&&&&&&&&&&&&&&&&&&&&&&&设置最大最小&&&&&&&&&&&&&&&&&&&&&&&&&&&");
ThreadPool.GetMaxThreads(out int workerThreads1, out int completionPortThreads1);
Console.WriteLine($"当前电脑最大workerThreads={workerThreads1} 最大completionPortThreads={completionPortThreads1}");
ThreadPool.GetMinThreads(out int workerThreadsMin1, out int completionPortThreadsMin1);
Console.WriteLine($"当前电脑最大workerThreads={workerThreadsMin1} 最大completionPortThreads={completionPortThreadsMin1}");
}
5、QueueUserWorkItem(WaitCallback)、QueueUserWorkItem(WaitCallback, Object)
WaitCallback 是 带一个object类型参数的委托
{
ThreadPool.QueueUserWorkItem(o => DoSomeThing(), new object());
ThreadPool.QueueUserWorkItem(NoReturnWithParamater,);
}
public static void DoSomeThing()
{
Console.WriteLine("********DoSomeThing Start ManagedThreadId:{0} {1}********", Thread.CurrentThread.ManagedThreadId.ToString(""), DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"));
long sum = ;
for (int i = ; i < ; i++)
{
sum += i;
}
//Thread.Sleep(2000);
Console.WriteLine("********DoSomeThing End ManagedThreadId:{0} {1}********", Thread.CurrentThread.ManagedThreadId.ToString(""), DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"));
}
public static void NoReturnWithParamater(object obj)
{
Console.WriteLine("********NoReturnWithParamater Paramater:{2} ManagedThreadId:{0} {1}********", Thread.CurrentThread.ManagedThreadId.ToString(""), DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"), obj);
}
线程等待
{
////等待
ManualResetEvent mre = new ManualResetEvent(false);
//false---关闭---Set打开---true---WaitOne就能通过
//true---打开--ReSet关闭---false--WaitOne就只能等待
ThreadPool.QueueUserWorkItem(o =>
{
DoSomeThing();
mre.Set();
});
Console.WriteLine("Do Something else...");
Console.WriteLine("Do Something else...");
Console.WriteLine("Do Something else...");
mre.WaitOne();
Console.WriteLine("任务已经完成了。。。");
}
{
//不要阻塞线程池里面的线程
ThreadPool.SetMaxThreads(, );
ManualResetEvent mre = new ManualResetEvent(false);
for (int i = ; i < ; i++)
{
int k = i;
ThreadPool.QueueUserWorkItem(t =>
{
Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId.ToString("")} show {k}");
if (k == )
{
mre.Set();
}
else
{
mre.WaitOne();
}
});
}
if (mre.WaitOne())
{
Console.WriteLine("任务全部执行成功!");
}
Console.WriteLine("end");
}
执行上面代码 当线程池最大线程数大于程序需要的线程数,程序正常执行,取消注释或当线程池最大线程数少于程序需要的线程数,程序无法正常执行
微软文档:
ThreadPool:https://docs.microsoft.com/zh-cn/dotnet/api/system.threading.threadpool?view=netframework-4.8
ManualResetEvent:https://docs.microsoft.com/zh-cn/dotnet/api/system.threading.manualresetevent?view=netframework-4.8
WaitHandle:https://docs.microsoft.com/zh-cn/dotnet/api/system.threading.waithandle?view=netframework-4.8
C# ThreadPool 线程池的更多相关文章
- ThreadPool线程池 小结
ThreadPool类提供一个线程池,该线程池可用于发送工作项.处理异步 I/O.代表其他线程等待以及处理计时器 线程池通过为应用程序提供一个由系统管理的辅助线程池使您可以更为有效地使用线程.一个线程 ...
- 转载【浅谈ThreadPool 线程池】
浅谈ThreadPool 线程池 http://www.cnblogs.com/xugang/archive/2010/04/20/1716042.html
- 【多线程】-ThreadPool线程池
ThreadPool介绍: Thread类是一个静态类,所有不存在实例化构造函数操作,直接可以调用其内所存在的方法. 微软官网给出的解释: 提供一个线程池,该线程池可用于执行任务.发送工作项.处理异步 ...
- .net 线程基础 ThreadPool 线程池
1. ThreadPool 线程池异步: //public static bool QueueUserWorkItem(WaitCallback callBack); //public static ...
- 浅谈ThreadPool 线程池(引用)
出自:http://www.cnblogs.com/xugang/archive/2010/04/20/1716042.html 浅谈ThreadPool 线程池 相关概念: 线程池可以看做容纳线程的 ...
- 多线程之旅(ThreadPool 线程池)
一.什么是ThreadPool 线程池(源码) 1.线程池顾名思义,有我们的系统创建一个容器装载着我们的线程,由CLR控制的所有AppDomain共享.线程池可用于执行任务.发送工作项.处理异步 I/ ...
- 多线程 ThreadPool线程池
简单说明一下: 线程池可以看做容纳线程的容器:一个应用程序最多只能有一个线程池:ThreadPool静态类通过QueueUserWorkItem()方法将工作函数排入线程池: 每排入一个工作函数,就相 ...
- Delphi ThreadPool 线程池(Delphi2009以上版本适用)
http://blog.sina.com.cn/s/blog_6250a9df0101kref.html 在网上查找Delphi线程池,结果发现寥寥无几. 看了半天源代码,弄得一头雾水,觉得不容易理解 ...
- ThreadPool 线程池的作用
相关概念: 线程池可以看做容纳线程的容器: 一个应用程序最多只能有一个线程池: ThreadPool静态类通过QueueUserWorkItem()方法将工作函数排入线程池: 每排入一个工作函数,就相 ...
- 『Python』 ThreadPool 线程池模板
Python 的 简单多线程实现 用 dummy 模块 一句话就可以搞定,但需要对线程,队列做进一步的操作,最好自己写个线程池类来实现. Code: # coding:utf-8 # version: ...
随机推荐
- map.entrySet().iterator()
1.首先创建一个HashMap, Map map= new HashMap(); 2.Iterator iter= map.entrySet().iterator(); 首先是map.entrySet ...
- .NET进阶篇06-async异步、thread多线程4
知识需要不断积累.总结和沉淀,思考和写作是成长的催化剂 梯子 一.锁1.lock2.Interlocked3.Monitor4.SpinLock5.Mutex6.Semaphore7.Events1. ...
- Springboot中使用redis进行api限流
api限流的场景 限流的需求出现在许多常见的场景中 秒杀活动,有人使用软件恶意刷单抢货,需要限流防止机器参与活动 某api被各式各样系统广泛调用,严重消耗网络.内存等资源,需要合理限流 淘宝获取ip所 ...
- 【nodejs原理&源码赏析(3)】欣赏手术级的原型链加工艺术
[摘要] 学习经典代码中的prototype加工 示例代码托管在:http://www.github.com/dashnowords/blogs 好的代码都差不多,烂的代码却各有各的烂法. 一. 概述 ...
- milvus安装及其使用教程
milvus 简介 milvus是干什么的?通俗的讲,milvus可以让你在海量向量库中快速检索到和目标向量最相似的若干个向量,这里相似度量标准可以是内积或者欧式距离等.借用官方的话说就是: Milv ...
- luogu P4065 [JXOI2017]颜色 |随机化+前缀和
题目描述 可怜有一个长度为 n 的正整数序列 Ai,其中相同的正整数代表着相同的颜色. 现在可怜觉得这个序列太长了,于是她决定选择一些颜色把这些颜色的所有位置都删去. 删除颜色 i 可以定义为把所有满 ...
- Zookeeper选取机制
1)半数机制:集群中半数以上机器存活,集群可用.所以Zookeeper适合安装奇数台服务器. 2)Zookeeper虽然在配置文件中并没有指定Master和Slave.但是,Zookeeper工作时, ...
- ACM中java中BigInteger和Decimal用到的主要函数
java中大数以及高精度常用函数 使用java大数类解决问题时我们需要注意两个方面:1.不能有包名,也就是说我们要把主类放到默认的包里,如果你的代码里出现形如package cn.gov.test;这 ...
- 解决pyinstaller在单一文件时无法正确添加权限清单问题,(UAC,uac_admin,manifest,asInvoker,python,requireAdministrator)
做了3天的win10的兼容性测试,大部分时间都卡权限获取这了. 以下废话很多,想直接找解决方法,请跳至红字 首先,简单说下uac,自vista后windows再次加严了权限管理,uac (账户控制) ...
- tensorflow SavedModelBuilder用法
训练代码: # coding: utf-8 from __future__ import print_function from __future__ import division import t ...