线程池[ThreadPool]
C#多线程学习 之 线程池[ThreadPool]
在多线程的程序中,经常会出现两种情况:
一种情况: 应用程序中,线程把大部分的时间花费在等待状态,等待某个事件发生,然后才能给予响应
这一般使用ThreadPool(线程池)来解决;
另一种情况: 线程平时都处于休眠状态,只是周期性地被唤醒
这一般使用Timer(定时器)来解决;
本篇文章单单讲线程池[ThreadPool]
ThreadPool类 MSDN帮助信息 : http://msdn.microsoft.com/zh-cn/library/system.threading.threadpool.aspx#Y0
将任务添加进线程池:
ThreadPool.QueueUserWorkItem(new WaitCallback(方法名));
重载
ThreadPool.QueueUserWorkItem(new WaitCallback(方法名), 参数);
因为ThreadPool是静态类 所以不需要实例化.
对于线程池主要的控制有控制线程数大小:
ThreadPool.SetMaxThreads 方法
public static bool SetMaxThreads(
int workerThreads,
int completionPortThreads
)
参数:
workerThreads 类型: System.Int32线程池中辅助线程的最大数目。 completionPortThreads 类型: System.Int32
线程池中异步 I/O 线程的最大数目。
例子:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace 多线程池试验
{
class Program
{
public static void Main()
{
ThreadPool.SetMaxThreads(3, 3);
for ( int i = 0; i < 50; i++)
{
thr t = new thr();
ThreadPool.QueueUserWorkItem( new WaitCallback(t.ThreadProc), i);
}
Console.WriteLine( "断点测试" );
Thread.Sleep(100000);
Console.WriteLine( "运行结束" );
}
public class thr
{
public void ThreadProc( object i)
{
Console.WriteLine( "Thread[" + i.ToString() + "]" );
Thread.Sleep(1000);
}
}
}
}
输出结果:
您会发现 断点测试 在上面了, 这是什么原因呢?
原因:
1. 线程池的启动和终止不是我们程序所能控制的, 我反正是不知道的, 你如果知道的话 可以发邮件给我 henw@163.com
2. 线程池中的线程执行完之后是没有返回值的.
总之一句话, 我们不知道线程池他干了什么, 那么我们该怎么解决 任务完成问题呢?
操作系统提供了一种”信号灯”(ManualResetEvent)
ManualResetEvent 允许线程通过发信号互相通信。通常,此通信涉及一个线程在其他线程进行之前必须完成的任务。当一个线程开始一个活动(此活动必须完成后,其他线程才能开始)时,它调用 Reset 以将 ManualResetEvent 置于非终止状态,此线程可被视为控制 ManualResetEvent。调用 ManualResetEvent 上的 WaitOne 的线程将阻止,并等待信号。当控制线程完成活动时,它调用 Set 以发出等待线程可以继续进行的信号。并释放所有等待线程。一旦它被终止,ManualResetEvent 将保持终止状态(即对 WaitOne 的调用的线程将立即返回,并不阻塞),直到它被手动重置。可以通过将布尔值传递给构造函数来控制 ManualResetEvent 的初始状态,如果初始状态处于终止状态,为 true;否则为 false。
详细见MSDN: http://msdn.microsoft.com/zh-cn/library/system.threading.manualresetevent.aspx
主要使用了
eventX.WaitOne(Timeout.Infinite, true); 阻止当前线程,直到当前 WaitHandle 收到信号为止。
eventX.Set(); 将事件状态设置为终止状态,允许一个或多个等待线程继续。
修改后的程序:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace 多线程池试验
{
class Program
{
public static void Main()
{
//新建ManualResetEvent对象并且初始化为无信号状态
ManualResetEvent eventX = new ManualResetEvent( false );
ThreadPool.SetMaxThreads(3, 3);
thr t = new thr(15, eventX);
for ( int i = 0; i < 15; i++)
{
ThreadPool.QueueUserWorkItem( new WaitCallback(t.ThreadProc), i);
}
//等待事件的完成,即线程调用ManualResetEvent.Set()方法
//eventX.WaitOne 阻止当前线程,直到当前 WaitHandle 收到信号为止。
eventX.WaitOne(Timeout.Infinite, true );
Console.WriteLine( "断点测试" );
Thread.Sleep(10000);
Console.WriteLine( "运行结束" );
}
public class thr
{
public thr( int count,ManualResetEvent mre)
{
iMaxCount = count;
eventX = mre;
}
public static int iCount = 0;
public static int iMaxCount = 0;
public ManualResetEvent eventX;
public void ThreadProc( object i)
{
Console.WriteLine( "Thread[" + i.ToString() + "]" );
Thread.Sleep(2000);
//Interlocked.Increment()操作是一个原子操作,作用是:iCount++ 具体请看下面说明
//原子操作,就是不能被更高等级中断抢夺优先的操作。你既然提这个问题,我就说深一点。
//由于操作系统大部分时间处于开中断状态,
//所以,一个程序在执行的时候可能被优先级更高的线程中断。
//而有些操作是不能被中断的,不然会出现无法还原的后果,这时候,这些操作就需要原子操作。
//就是不能被中断的操作。
Interlocked.Increment( ref iCount);
if (iCount == iMaxCount)
{
Console.WriteLine( "发出结束信号!" );
//将事件状态设置为终止状态,允许一个或多个等待线程继续。
eventX.Set();
}
}
}
}
}
输出结果:
顺序正常了.
程序源码: 多线程池试验.zip
欢迎大家一起探讨!
分类: .Net
.Net
C#多线程学习 之 线程池[ThreadPool]
posted @ 2012-01-06 16:43 hen 阅读(1082) | 评论 (2) 编辑
关于Json的那点事
posted @ 2011-12-16 18:23 hen 阅读(147) | 评论 (0) 编辑
ASP.NET导航,自定义数据源绑定[sitemap文件]
posted @ 2011-12-04 16:48 hen 阅读(172) | 评论 (0) 编辑
C#配置文件读取 - ConfigurationManager.AppSettings
posted @ 2011-11-30 10:51 hen 阅读(76) | 评论 (0) 编辑
ASP.NET [C#]正则表达式
posted @ 2011-11-16 13:22 hen 阅读(13) | 评论 (0) 编辑
ASCII码对照表
posted @ 2011-11-10 13:42 hen 阅读(10) | 评论 (0) 编辑
js Html结构转字符串形式显示
posted @ 2011-11-09 09:28 hen 阅读(125) | 评论 (0) 编辑
.aspx 页面引用命名空间
posted @ 2011-11-04 14:12 hen 阅读(363) | 评论 (0) 编辑
asp.net inc 的使用
posted @ 2011-10-26 10:29 hen 阅读(182) | 评论 (0) 编辑
Asp.net .net(C#) 获取当前命名空间,类名,方法名的方法
posted @ 2011-10-13 10:12 hen 阅读(1041) | 评论 (0) 编辑
DLL反编译,DLL反编译成C#代码, 有些不良同学会用到哦!
posted @ 2011-10-12 10:53 hen 阅读(101) | 评论 (0) 编辑
json的使用 前后台统一以对象的方式编程
posted @ 2011-10-09 14:02 hen 阅读(1670) | 评论 (7) 编辑
配置文件 值的写入和读取
posted @ 2011-10-08 15:48 hen 阅读(255) | 评论 (6) 编辑
Asp.net(C#) windows 服务{用于实现计划任务,事件监控等}
posted @ 2011-09-29 18:10 hen 阅读(1623) | 评论 (19) 编辑
C#序列化
posted @ 2011-09-27 14:54 hen 阅读(245) | 评论 (0) 编辑
C# 队列 栈
posted @ 2011-09-26 09:26 hen 阅读(234) | 评论 (0) 编辑
C#(ASP.net)从其他网站抓取内容并截取有用信息
posted @ 2011-09-23 16:40 hen 阅读(887) | 评论 (11) 编辑
ASP.NET 计划任务(不使用外接程序,.net内部机制实现)
posted @ 2011-09-23 15:02 hen 阅读(398) | 评论 (0) 编辑
获取当前类得位置以及方法名
posted @ 2011-09-22 13:34 hen 阅读(46) | 评论 (0) 编辑
C# 程序执行时间查看, 效率查看
posted @ 2011-09-14 15:23 hen 阅读(41) | 评论 (0) 编辑
类类似数组一样输出
posted @ 2011-08-08 09:08 hen 阅读(53) | 评论 (0) 编辑
常用JS,C#正则表达式大汇总.
posted @ 2011-07-25 16:24 hen 阅读(46) | 评论 (0) 编辑
asp.net(C#) Excel导出类 导出.xls文件
posted @ 2011-07-11 17:31 hen 阅读(330) | 评论 (0) 编辑
Visual Studio快捷键 [VS2008/VS2005]快捷键
posted @ 2011-07-08 08:56 hen 阅读(759) | 评论 (0) 编辑
Cookie乱码解决方法
posted @ 2011-07-07 14:00 hen 阅读(83) | 评论 (0) 编辑
C# 技巧,常识
posted @ 2011-07-07 13:37 hen 阅读(53) | 评论 (0) 编辑
asp.net 后台向前台注册JS脚本
posted @ 2011-07-06 13:56 hen 阅读(185) | 评论 (0) 编辑
C#常用字符格式判断
posted @ 2011-06-30 10:50 hen 阅读(133) | 评论 (0) 编辑
C#:rdlc - 报表实例
posted @ 2011-06-27 10:03 hen 阅读(192) | 评论 (0) 编辑
TreeView 树形控件 - asp.net
posted @ 2011-06-27 09:28 hen 阅读(290) | 评论 (0) 编辑
asp.net: RDLC 报表
posted @ 2011-06-24 15:57 hen 阅读(132) | 评论 (2) 编辑
C#, JS, HTML - 转义字符
posted @ 2011-06-23 10:10 hen 阅读(443) | 评论 (0) 编辑
必须写闭合标签
posted @ 2011-06-21 09:10 hen 阅读(106) | 评论 (0) 编辑
vs“当前不会命中断点 还没有为该文档加载任何符号”解决方法
posted @ 2011-06-20 13:12 hen 阅读(537) | 评论 (2) 编辑
Repeater中使用Button
posted @ 2011-06-13 22:29 hen 阅读(183) | 评论 (0) 编辑
在Repeater 中使用Repeater的方法, Repeater2 内嵌 Repeater1操作
posted @ 2011-06-13 22:27 hen 阅读(146) | 评论 (0) 编辑
简化: ASP.NET 事件触发顺序
posted @ 2011-06-08 11:19 hen 阅读(122) | 评论 (0) 编辑
ViewState - 页面状态保留
posted @ 2011-06-04 21:53 hen 阅读(104) | 评论 (0) 编辑
asp.net引用用户控件
posted @ 2011-05-18 17:03 hen 阅读(175) | 评论 (0) 编辑
ASP.NET 获取来源网站的网址,获取上一网页的网址,获取来源网页的URL,获取上一网页的URL
posted @ 2011-05-18 10:42 hen 阅读(215) | 评论 (0) 编辑
vs 附加到进程
posted @ 2011-05-17 13:17 hen 阅读(41) | 评论 (0) 编辑
C#,asp.net,命名空间名,类名,方法名的获得
posted @ 2011-05-15 12:34 hen 阅读(210) | 评论 (0) 编辑
asp.net 路径
posted @ 2011-05-15 12:20 hen 阅读(152) | 评论 (0) 编辑
C#,Dictionary,asp.net 字典
posted @ 2011-05-15 10:14 hen 阅读(398) | 评论 (0) 编辑
C#,asp.net去除字符串前后空格,Trim()
posted @ 2011-05-13 15:22 hen 阅读(176) | 评论 (0) 编辑
asp:Button 事件,点击事件 html Button runat="sever"
posted @ 2011-05-13 15:17 hen 阅读(401) | 评论 (0) 编辑
枚举,以及中文对应解释
posted @ 2011-05-11 10:04 hen 阅读(86) | 评论 (0) 编辑
DropDownList设置选定项,设置选择项,最安全的方法
posted @ 2011-04-27 15:03 hen 阅读(264) | 评论 (7) 编辑
存储过程的使用以及查询语句的使用
posted @ 2011-04-23 10:25 hen 阅读(33) | 评论 (1) 编辑
C# 后台取值
posted @ 2011-04-23 09:55 hen 阅读(21) | 评论 (0) 编辑
asp.net 页面事件顺序,asp.net 事件顺序,C#事件触发顺序
posted @ 2011-04-21 09:24 hen 阅读(166) | 评论 (0) 编辑
C#时间(DateTime)格式化
posted @ 2011-04-20 17:09 hen 阅读(266) | 评论 (0) 编辑
C# Xml 操作
posted @ 2011-04-19 15:45 hen 阅读(33) | 评论 (0) 编辑
ASP.NET PlaceHolder 服务器控件
posted @ 2011-04-19 09:42 hen 阅读(42) | 评论 (0) 编辑
DropDownList 下拉菜单控件
posted @ 2011-04-19 09:16 hen 阅读(31) | 评论 (0) 编辑
Session 不单单可以保存一个值,还可以保存一个类的实例
posted @ 2011-04-19 08:40 hen 阅读(40) | 评论 (0) 编辑
C#服务器控件客户端ID的获得
posted @ 2011-04-19 08:30 hen 阅读(23) | 评论 (0) 编辑
C# ACCESS 参数化SQL语句出错汇总
posted @ 2011-04-18 23:54 hen 阅读(107) | 评论 (0) 编辑
asp.net mvc 与 asp.net结合(asp.net mvc 技巧)
posted @ 2011-04-17 14:05 hen 阅读(277) | 评论 (0) 编辑
asp.net 用户控件
posted @ 2011-04-13 14:09 hen 阅读(21) | 评论 (0) 编辑
asp.net(C#) Repeater 控件,重复内容(无默认html,高度可自定义化)
posted @ 2011-04-13 13:37 hen 阅读(174) | 评论 (0) 编辑
C# ??(问问,问号问号)运算符,可空值(申明加?(问号))的克星
posted @ 2011-04-13 11:43 hen 阅读(176) | 评论 (0) 编辑
C# access update 出错总结,注意事项
posted @ 2011-04-13 00:10 hen 阅读(125) | 评论 (0) 编辑
OleDbType,C#,access 对应数据类型,互相对应
posted @ 2011-04-12 23:32 hen 阅读(122) | 评论 (0) 编辑
C# 字符串常用函数
posted @ 2011-04-11 22:04 hen 阅读(27) | 评论 (0) 编辑
C#图片无损压缩
posted @ 2011-04-07 09:30 hen 阅读(198) | 评论 (5) 编辑
C#数据类型转换,Convert
posted @ 2011-04-07 09:01 hen 阅读(109) | 评论 (0) 编辑
asp.net mvc && asp.net 页面跳转
posted @ 2011-04-02 23:57 hen 阅读(670) | 评论 (0) 编辑
作者: Leo_wl
出处: http://www.cnblogs.com/Leo_wl/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
版权信息声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://www.haodehen.cn/did50033