- 浏览: 215078 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
synack:
写的很好,图文并茂,语言简单清晰,赞!
SkipList 跳表 -
king_c:
jiandandecaicai 写道你好,请教一下是如何通过E ...
从Hadoop URL 中读取数据 -
jiandandecaicai:
你好,请教一下是如何通过Eclipse来连接Hadop机群的, ...
从Hadoop URL 中读取数据
摘要:
系列文章,从一个基本的代码说起,逐步探索 ThreadPool 的奥妙。
首先,看看线程池的样子:
从上图看出,线程池维护1个至n个线程,操作系统从请求队列中提取请求分配个线程池中的适合线程处理。
using System; using System.Threading; public class ThreadBase { public static void Main ( ) { System.Threading.WaitCallback waitCallback = new WaitCallback ( MyThreadWork ); ThreadPool.QueueUserWorkItem ( waitCallback, "第一个线程" ); ThreadPool.QueueUserWorkItem ( waitCallback, "第二个线程" ); ThreadPool.QueueUserWorkItem ( waitCallback, "第三个线程" ); ThreadPool.QueueUserWorkItem ( waitCallback, "第四个线程" ); Console.ReadLine ( ); } public static void MyThreadWork ( object state ) { Console.WriteLine ( "线程现在开始启动…… {0}",(string)state ); Thread.Sleep ( 10000 ); Console.WriteLine ( "运行结束…… {0}",( string ) state ); } }
分析上面的代码:
一、首先定义了一个 System.Threading.WaitCallback 对象 waitCallback。
WaitCallback 是一个委托,表示线程池线程要执行的回调方法,它的原型如下:
[ComVisibleAttribute(true)] public delegate void WaitCallback ( Object state )1、这里有一个 Callback 机制的问题,所谓的Callback 简单的理解就是由操作系统调用的函数,我们自己写的程序不需要调用。就像有个修理工到家里搞修理,你只需要告诉他钳子、螺丝刀、胶布等修理工具在什么地方就行,而不要管他在什么时候、在什么地方怎样使用这些修理工具。
2、WaitCallback 的参数" Object state",这个参数包含回调方法要使用的信息的对象。在接下来的情况中我再说。
既然 WaitCallback 委托的原型如此,那么我们就申明一个跟它的样子差不多的函数,这个函数就是要线程做的事情。
public static void MyThreadWork ( object state )这里函数中多了一个 "static",这是因为Main的关系(更大一点就是因为C#语言机制的问题),如果WaitCallback 的对象不是在静态(static)方法中,这个static 是不需要的。
二、接着就是要执行的方法放入线程池中,以便操作系统执行。
我这里放置了四个方法要操作系统执行:
ThreadPool.QueueUserWorkItem ( waitCallback, "第一个线程" ); ThreadPool.QueueUserWorkItem ( waitCallback, "第二个线程" ); ThreadPool.QueueUserWorkItem ( waitCallback, "第三个线程" ); ThreadPool.QueueUserWorkItem ( waitCallback, "第四个线程" );这里,我放置到线程池中的操作是一样的,当然也可以不一样,接下来说。
三、最后阻塞主线程,等待线程池中的线程执行
Console.ReadLine ( );如果忽略掉这个代码,则有可能看不到任何输出
好了,这是主线程做的事情了,接下来看看线程池中的线程做的事情。
这个很简单,就是将线程的参数输出,然后线程睡眠(sleep)一段时间,最后输出线程结束的信息。
发表评论
-
openface 人脸识别开放平台
2014-08-10 17:27 1722using System; using System.Co ... -
新中新二代身份证dll调用,报尝试读取或写入受保护的内存,这通常指示其他内存已损坏 这个错
2014-06-26 04:04 880新中新二代身份证dll调用问题: ... -
【OpenCV学习笔记】2.3 OpenCV2.2摄像头读取视频的问题和解决(VS2010)
2014-06-18 16:38 3890摄像头读取视频这一块研究了很长时间,终于弄好了。刚开始 ... -
C# 4.0 并行计算部分 [转发]
2014-05-03 15:24 1020沿用微软的写法,System.Threading.Task ... -
vector 转换成 数组 - [C++]
2013-12-13 18:06 4672参考: http://topic.csdn.n ... -
convert file into byte array
2012-05-12 23:16 896private byte [] StreamFile(s ... -
使用.NET中的XML注释-- 创建帮助文档入门篇
2012-04-07 11:24 1461一.摘要 在本系列 ... -
C#访问和操作MYSQL数据库
2012-03-23 09:59 1578这里介绍下比较简单的方式,引用MySql.Data.dll ... -
C#访问和操作MYSQL数据库
2012-03-23 09:58 1这里介绍下比较简单的方式,引用MySql.Data.dll ... -
http://www.microsoft.com/china/MSDN/library/langtool/VCSharp/USgetstart_vcsharp.
2012-03-22 21:26 973http://www.microsoft.com/china/ ... -
使用Signature Tool自动生成P/Invoke调用Windows API的C#函数声明
2012-03-17 22:47 1251在网上看到很多网友在.NET程序中调用Win32 API, ... -
MarshalAs
2012-03-17 22:04 1301MarshalAs是提供向非托管代码封送数据时的规则。比如S ... -
Timeout expired. The timeout period elapsed prior ..
2012-02-26 19:13 1603关于这个问题,要 ... -
c#winform编程中获取cpu个数的方法 详细出处参考:http://www.ityoudao.com/Web/Csharp_590_1542.html
2012-02-23 18:44 919前些时间,为了配置合更加快速有效地制作Sphinx分词搜 ... -
C# socket 服务端实例
2011-12-08 19:50 1013IPAddress ipAddress; ... -
C# 文件操作
2011-12-08 19:40 717文件读取: Console.W ... -
C# 多线程处理相关说明: WaitHandle,waitCallback, ThreadPool.QueueUserWorkItem
2011-09-03 15:33 4062最近接触C#的一个项目,里面用到了多线程处理,这里做个备 ... -
C# 调用C++ DLL编码问题
2011-08-29 14:25 1506今天用C#调用C++写的一个DLL 死活不成功 ... -
关于global.asax 总结经验
2011-08-25 14:13 13661. 关于global.asax 总结 ... -
WebService获取服务端硬件信息和客户端IP,MAC,浏览器信息
2011-07-28 18:58 1409using System;using System.Co ...
相关推荐
c#的ThreadPool使用笔记.pdf
利用线程池来ThreadPool.QueueUserWorkItem来处理多线程问题,本人也是初学着,欢迎大家多多来探讨多线程的技术问题..
C# Thread、ThreadPool、Task测试,三者创建、启动的方法
普通线程的创建,通过 委托ThreadStart对应的函数来执行相关操作; 通过线程池,可以直接从池中查找出空闲线程,让它执行委托WaitCallback对应函数...使用线程池来找到一个线程执行函数,实质减少了new thread等过程。
。。。
线程池示例
使用WaitHandle例子 内含C#编写源代码
主要介绍了C#多线程ThreadPool线程池的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
c# 线程池的管理是通过ThreadPool
C#线程池 所有线程运行完毕,只是测试代码,用来弄清楚,打印信息很明确,适合初学者
C# 多线程 线程池 线程同步 单线程 线程的开始、挂起、恢复、结束、同步和异步
ThreadPool 线程池管理单元 带调用例子
threadpool实现方式 threadpool实现方式 threadpool实现方式
在单CPU系统的一个单位时间(time slice)内,CPU只能运行单个线程,运行顺序取决于线程的优先级别。如果在单位时间内线程未能完成执行,系统就会把线程的状态信息保存到线程的本地存储器(TLS) 中,以便下次执行时...
threadPool的实现代码
javascript ThreadPool
ThreadPoolTask,轮循的执行任务.