ThreadPool线程池
1.GetMaxThreads,GetMinThreads
class Program
{
static void Main(string[] args)
{
int workerThreads;
int completePortsThreads;
ThreadPool.GetMaxThreads(out workerThreads, out completePortsThreads);
Console.WriteLine("线程池中最大的线程数{0},线程池中异步IO线程的最大数目{1}", workerThreads, completePortsThreads);
ThreadPool.GetMinThreads(out workerThreads, out completePortsThreads);
Console.WriteLine("线程池中最小的线程数{0},线程池中异步IO线程的最小数目{1}", workerThreads, completePortsThreads);
Console.Read();
}
}

线程不是越多越好
①:线程很多的话,线程调度就越频繁,可能就会出现某个任务执行的时间比线程调度花费的时间短很多的尴尬局面。
②:我们要知道一个线程默认占用1M的堆栈空间,如果10230个线程将会占用差不多10G的内存空间,我想普通的电脑立马罢工。
2.SetMaxTheads,SetMinThreads
class Program
{
static void Main(string[] args)
{
int workerThreads;
int completePortsThreads;
ThreadPool.SetMaxThreads(, );
ThreadPool.SetMinThreads(, );
ThreadPool.GetMaxThreads(out workerThreads, out completePortsThreads);
Console.WriteLine("线程池中最大的线程数{0},线程池中异步IO线程的最大数目{1}\n", workerThreads, completePortsThreads);
ThreadPool.GetMinThreads(out workerThreads, out completePortsThreads);
Console.WriteLine("线程池中最小的线程数{0},线程池中异步IO线程的最小数目{1}\n", workerThreads, completePortsThreads);
Console.Read();
}
}
3.QueueUserWorkItem
需要容纳任务并执行的方法来了,该方法有一个WaitCallBack的委托,我们只需要把将要执行的任务丢给委托,CLR将会在线程池中调派空闲的线程执行。
class Program
{
static void Main(string[] args)
{
ThreadPool.QueueUserWorkItem(Run1);
Console.Read();
} static void Run1(object obj)
{
Console.WriteLine("我是线程{0},我是线程池中的线程吗? \n回答:{1}", Thread.CurrentThread.ManagedThreadId, Thread.CurrentThread.IsThreadPoolThread);
}
}

可能我们也需要像普通的Thread一样带一些参数到工作线程中,QueueUserWorkItem的第二个重载版本解决了我们的问题。
class Program
{
static void Main(string[] args)
{
ThreadPool.QueueUserWorkItem(Run1, "我是主线程");
Console.Read();
} static void Run1(object obj)
{
Console.WriteLine(obj);
}
}

4.RegisterWaitForSingleObject
我们知道,如果我们把要执行的任务丢给线程池后,相当于把自己的命运寄托在别人的手上。
①:我们再也不能控制线程的优先级了。
②:丢给线程池后,我们再也不能将要执行的任务取消了。
是的,给别人就要遵守别人的游戏规则,不过RegisterWaitForSingleObject提供了一些简单的线程间交互,因为该方法的第一个参数是
WaitHandle,在VS对象浏览器中,我们发现EventWaitHandle继承了WaitHandle,而ManualResetEvent和AutoResetEvent都继承于
EventWaitHandle,也就是说我们可以在RegisterWaitForSingleObject溶于信号量的概念。
class Program
{
static void Main(string[] args)
{
AutoResetEvent ar = new AutoResetEvent(false);
ThreadPool.RegisterWaitForSingleObject(ar, Run1, null, Timeout.Infinite, false);
Console.WriteLine("时间:{0} 工作线程请注意,您需要等待5s才能执行。\n", DateTime.Now);
//5s
Thread.Sleep();
ar.Set();
Console.WriteLine("时间:{0} 工作线程已执行。\n", DateTime.Now);
Console.Read();
} static void Run1(object obj, bool sign)
{
Console.WriteLine("当前时间:{0} 我是线程{1}\n", DateTime.Now, Thread.CurrentThread.ManagedThreadId);
}
}

我们知道在Threading下面有一个Timer计时器,当定期触发任务的时候都是由线程池提供并给予执行,那么这里我们溶于信号量的概念以后同样可以实现计时器的功能。
class Program
{
static void Main(string[] args)
{
AutoResetEvent ar = new AutoResetEvent(false);
//参数2000:其实就是WaitOne(2000),采取超时机制
ThreadPool.RegisterWaitForSingleObject(ar, Run1, null, , false);
Console.Read();
} static void Run1(object obj, bool sign)
{
Console.WriteLine("当前时间:{0} 我是线程{1}\n", DateTime.Now, Thread.CurrentThread.ManagedThreadId);
}
}

有时候,跑着跑着我们需要在某个时刻停止它,没关系,RegisterWaitForSingleObject返回一个RegisteredWaitHandle类,那么我们就通过RegisteredWaitHandle来动态的控制,比如说停止计数器的运行。
class Program
{
static void Main(string[] args)
{
RegisteredWaitHandle handle = null;
AutoResetEvent ar = new AutoResetEvent(false);
//参数2000:其实就是WaitOne(2000),采取超时机制
handle = ThreadPool.RegisterWaitForSingleObject(ar, Run1, null, , false);
//10s
Thread.Sleep();
handle.Unregister(ar);
Console.WriteLine("干掉线程。");
Console.Read();
} static void Run1(object obj, bool sign)
{
Console.WriteLine("当前时间:{0} 我是线程{1}\n", DateTime.Now, Thread.CurrentThread.ManagedThreadId);
}
}

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: ...
随机推荐
- k64 datasheet学习笔记10---Signal Multiplexing and Signal Descriptions
1.前言 本文主要描述多功能引脚相关的内容,包括5个32位的引脚的端口,每个32pin端口被指定一个中断 2.Signal Multiplexing Integration 3. Port contr ...
- mongoDB Liunx下安装及配置
以下以ubuntu 16.04(64位)操作系统为例: 一.下载和安装 在ubuntu下安装mongodb可以使用 apt-get进行安装,也可以直接下载编译好的二进制文件进行安装.下面主要介绍使用二 ...
- H5混合开发app常用代码
1.Android与H5互调可以让我们的实现混合开发,至于混合开发就是在一个App中内嵌一个轻量级的浏览器(高性能webkit内核浏览器),一部分原生的功能改为Html 5来开发.然后这个浏览器又封装 ...
- unity制作背景
- Mudo C++网络库第五章学习笔记
高效的多线程日志 日志(logging)有两个意思: 诊断日志(diagnostic log), 常用日志库提供日志功能; 交易日志(transaction log), 用于记录状态变更, 通过回放日 ...
- 关于Mac的rootless问题
由于在OS X 10.11版本添加了rootless,使得root用户在DOS命令下无法操作系统文件并提示无权限. 解决办法: 首先确认升级到最新版本 重新启动电脑,持续按住Command-R直到看见 ...
- httplib urllib urllib2 pycurl 比较
最近网上面试看到了有关这方面的问题,由于近两个月这些库或多或少都用过,现在根据自己的经验和网上介绍来总结一下. httplib 实现了HTTP和HTTPS的客户端协议,一般不直接使用,在python更 ...
- 通过zabbix自带api进行主机的批量添加操作
通过zabbix自带api进行批量添加主机 我们需要监控一台服务器的时候,当客户端装好zabbix-agent端并正确配置以后,需要在zabbix-server的web gui界面进行添加zabbix ...
- python学习第40天
# 多表查询 # 索引的基础理论 + 数据准备
- Laravel 5.2服务----用户验证Auth相关问题
关于laravel的auth()用户认证这一块,面前我也是,有用到,有碰到什么问题我就记录下来. 手动认证用户 <?php namespace App\Http\Controllers; use ...