- 浏览: 222732 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
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 1771using System; using System.Co ... -
新中新二代身份证dll调用,报尝试读取或写入受保护的内存,这通常指示其他内存已损坏 这个错
2014-06-26 04:04 909新中新二代身份证dll调用问题: ... -
【OpenCV学习笔记】2.3 OpenCV2.2摄像头读取视频的问题和解决(VS2010)
2014-06-18 16:38 3937摄像头读取视频这一块研究了很长时间,终于弄好了。刚开始 ... -
C# 4.0 并行计算部分 [转发]
2014-05-03 15:24 1056沿用微软的写法,System.Threading.Task ... -
vector 转换成 数组 - [C++]
2013-12-13 18:06 4724参考: http://topic.csdn.n ... -
convert file into byte array
2012-05-12 23:16 921private byte [] StreamFile(s ... -
使用.NET中的XML注释-- 创建帮助文档入门篇
2012-04-07 11:24 1497一.摘要 在本系列 ... -
C#访问和操作MYSQL数据库
2012-03-23 09:59 1606这里介绍下比较简单的方式,引用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 1196http://www.microsoft.com/china/ ... -
使用Signature Tool自动生成P/Invoke调用Windows API的C#函数声明
2012-03-17 22:47 1284在网上看到很多网友在.NET程序中调用Win32 API, ... -
MarshalAs
2012-03-17 22:04 1343MarshalAs是提供向非托管代码封送数据时的规则。比如S ... -
Timeout expired. The timeout period elapsed prior ..
2012-02-26 19:13 1669关于这个问题,要 ... -
c#winform编程中获取cpu个数的方法 详细出处参考:http://www.ityoudao.com/Web/Csharp_590_1542.html
2012-02-23 18:44 964前些时间,为了配置合更加快速有效地制作Sphinx分词搜 ... -
C# socket 服务端实例
2011-12-08 19:50 1058IPAddress ipAddress; ... -
C# 文件操作
2011-12-08 19:40 757文件读取: Console.W ... -
C# 多线程处理相关说明: WaitHandle,waitCallback, ThreadPool.QueueUserWorkItem
2011-09-03 15:33 4093最近接触C#的一个项目,里面用到了多线程处理,这里做个备 ... -
C# 调用C++ DLL编码问题
2011-08-29 14:25 1534今天用C#调用C++写的一个DLL 死活不成功 ... -
关于global.asax 总结经验
2011-08-25 14:13 14051. 关于global.asax 总结 ... -
WebService获取服务端硬件信息和客户端IP,MAC,浏览器信息
2011-07-28 18:58 1435using System;using System.Co ...
相关推荐
在C#编程中,`ThreadPool`是一个非常重要的概念,它是.NET Framework中用于管理线程的内置服务。ThreadPool允许开发者创建线程而无需显式地创建和管理线程对象,从而提高系统效率和资源利用率。线程池会根据系统资源...
以下是对"C#多线程笔记"中可能包含的知识点的详细解释。 1. **线程基础**: - **什么是线程**:线程是程序执行的最小单元,每个进程至少有一个线程,负责执行程序代码。 - **主线程与子线程**:主线程是程序的...
7. **多线程**:了解Thread类和ThreadPool的使用,掌握线程同步机制(如Mutex、Semaphore、Monitor)以及异步编程模型(如Task、async/await)。 8. **泛型接口与抽象类**:理解Interface和Abstract Class的区别,...
【C#线程系列讲座笔记整理】 一、线程基础 线程是操作系统中的基本执行单元,它在进程中运行,允许同一程序同时处理多个任务。在C#中,线程可以用于提高应用程序的并发性和响应性,特别是在多核处理器环境下。通过...
本笔记将深入探讨C#中的多线程编程,包括其基本概念、创建线程的方式、线程同步与互斥、线程安全以及线程池的使用。 ### 1. 基本概念 - **线程**:线程是程序的执行流程,每个进程至少包含一个线程。多线程意味着...
在本笔记中,我们将围绕C#多线程编程进行探讨,特别是使用`Interlocked`类进行线程同步以及`ReaderWriterLock`类来处理读写冲突的情况。 ### 使用`Interlocked`类进行线程同步 `Interlocked`类在.NET框架中提供了...
在IT领域,尤其是在软件开发中,C#是一种广泛使用的编程语言,它支持多线程编程,使得程序可以同时执行多个任务。"C#进程和线程资料集锦"这一主题涵盖了进程与线程的基本概念、管理和同步技术,是C#开发者必备的知识...
《BookRecord C#》是一款基于C#编程语言开发的个人软件,主要功能是提供一个类似于阅读书籍的应用,但在此基础上增加了书籍相关信息的保存与管理。软件内置了数据库,用于存储用户的阅读记录和书籍资料,同时也整合...
本文将深入探讨C#中的线程类及其重要知识点,结合“线程编程练习笔记”的内容进行详细讲解。 一、线程基础 线程是操作系统分配CPU时间的基本单位,每个进程至少有一个主线程。在C#中,`System.Threading`命名空间...
在IT行业中,C#是一种广泛使用的面向对象的编程语言,尤其在开发Windows应用程序、Web应用程序以及游戏开发等领域表现突出。本资源"**C#蜂巢工作机制系统与源代码.zip**"提供了一个基于C#实现的蜂巢工作系统,旨在...
7. **多线程**:在`System.Threading`命名空间中,`Thread`类用于创建和管理线程,`ThreadPool`类用于线程池管理。`Thread.Start()`启动线程,`Thread.Sleep()`暂停当前线程,`Thread.Abort()`尝试终止线程,`Thread...
10. **线程池**:`ThreadPool`类提供了一种高效的线程复用方式,通过`QueueUserWorkItem()`方法可以将任务放入线程池,减少线程创建和销毁的开销。 理解并熟练运用这些线程和同步概念,是编写高效、安全的多线程...
3. **多线程/异步处理**:为了提高抢购效率,软件可能采用了多线程或异步编程模型,如C#中的Task或.NET Framework的ThreadPool。这样可以在等待网络响应的同时处理其他任务,减少整体耗时。 4. **定时器与事件驱动*...