简单ThreadPool实现
由于最近需要用多线程处理一些问题,一开始我用了.net默认的ThreadPool,感觉不是很适合。于是我自己实现了一个简单的ThreadPool。
写的比较简单,有兴趣的朋友一起看看,共同改进。
代码主要由ThreadPoolEx,WorkItem,WorkQueue组成。
推荐使用新版本:http://www.cnblogs.com/ITAres/archive/2009/08/25/1553800.html
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Text;
5using System.Threading;
6using System.Collections;
7
8namespace NetDragon.ThreadPoolEx
9{
10 public class ThreadPoolEx
11 {
12 private WorkQueue _workQueue = new WorkQueue();
13
14 public int MaxThreadCount = 10;
15 public int MinThreadCount = 2;
16 private Hashtable _threadTable = null;
17
18 private int _threadCount = 0;
19 private int _inUseWorkThread = 0;
20
21 public double IdleTimeout = 10;
22
23 public ThreadPoolEx():this(10,2,2)
24 {
25 }
26
27 public ThreadPoolEx(int maxThreadCouont, int minThreadCount, int idleTimeout)
28 {
29 MaxThreadCount = maxThreadCouont;
30
31 MinThreadCount = minThreadCount;
32
33 IdleTimeout = idleTimeout;
34
35 _threadTable = Hashtable.Synchronized(new Hashtable(MaxThreadCount));
36 }
37
38 public void QueueUserWorkItem(WaitCallback waitCallback, object objParams)
39 {
40 EnqueueWorkItem(waitCallback, objParams);
41 }
42
43 private void EnqueueWorkItem(WaitCallback waitCallback,object objParams)
44 {
45 WorkItem workItem = new WorkItem() {
46
47 WorkCallback = waitCallback,
48 ObjParams = objParams
49 };
50
51 _workQueue.Push(workItem);
52
53 if (_inUseWorkThread + _waitWorkItem > _threadTable.Count)
54 {
55 StartThread();
56 }
57 }
58
59 private void StartThread()
60 {
61 if (_threadTable.Count < MaxThreadCount)
62 {
63 ++_threadCount;
64
65 Thread thread = new Thread(ProcessWorkItems);
66
67 thread.IsBackground = true;
68
69 thread.Name = "ThreadPoolEx #" + _threadCount;
70
71 thread.Priority = ThreadPriority.Normal;
72
73 _threadTable[thread] = System.DateTime.Now;
74
75 thread.Start();
76 }
77 }
78
79 private void ProcessWorkItems()
80 {
81
82 try
83 {
84 while (true)
85 {
86 WorkItem workItem = _workQueue.Pop();
87
88 if (workItem == null)
89 {
90 bool isTimeout = CurThreadIsTimeOut();
91
92 if (isTimeout)
93 {
94 if (_threadTable.Count > MinThreadCount)
95 {
96 _threadTable.Remove(Thread.CurrentThread);
97 break;
98 }
99 }
100
101 System.Threading.Thread.Sleep(100);
102 }
103 else
104 {
105
106 try
107 {
108 _threadTable[Thread.CurrentThread] = System.DateTime.Now;
109 Interlocked.Increment(ref _inUseWorkThread);
110
111 workItem.Execute();
112 }
113 catch (Exception)
114 {
115 // log something
116 }
117 finally
118 {
119 Interlocked.Decrement(ref _inUseWorkThread);
120 }
121 }
122 }
123 }
124 catch (ThreadAbortException)
125 {
126 Thread.ResetAbort();
127 }
128 finally
129 {
130 if (_threadTable.Contains(Thread.CurrentThread))
131 {
132 _threadTable.Remove(Thread.CurrentThread);
133 }
134 }
135 }
136
137 private bool CurThreadIsTimeOut()
138 {
139 DateTime lastAliveTime = (DateTime)_threadTable[Thread.CurrentThread];
140
141 DateTime curTime = System.DateTime.Now;
142
143 double waitSeconds = (curTime - lastAliveTime).TotalSeconds;
144
145 if(waitSeconds > IdleTimeout)
146 {
147 return true;
148 }
149
150 return false;
151
152 }
153
154 private int _waitWorkItem
155 {
156 get
157 {
158 return _workQueue.Count;
159 }
160 }
161
162 public int ThreadCount
163 {
164 get
165 {
166 return _threadTable.Count;
167 }
168 }
169 }
170}
171
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Text;
5using System.Threading;
6
7namespace NetDragon.ThreadPoolEx
8{
9 class WorkItem
10 {
11 public WaitCallback WorkCallback;
12
13 public object ObjParams;
14
15 public void Execute()
16 {
17 WorkCallback(ObjParams);
18 }
19 }
20}
21
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Text;
5
6namespace NetDragon.ThreadPoolEx
7{
8 class WorkQueue
9 {
10 private static object threadLock = new object();
11
12 private Queue<WorkItem> _workQueue = new Queue<WorkItem>();
13
14 public WorkItem Pop()
15 {
16 lock (threadLock)
17 {
18 if (_workQueue.Count > 0)
19 {
20 return _workQueue.Dequeue();
21 }
22 return null;
23 }
24 }
25
26
27 public void Push(WorkItem workItem)
28 {
29 lock (threadLock)
30 {
31 _workQueue.Enqueue(workItem);
32
33 }
34 }
35
36 public int Count
37 {
38 get
39 {
40 return _workQueue.Count;
41 }
42 }
43 }
44}
45
源代码下载
简单线程池实现v2版本
转载于:https://www.cnblogs.com/ITAres/archive/2009/03/27/1423414.html
简单ThreadPool实现相关推荐
- 简单使用Boost线程池threadpool
场景: 1.在一些多线程的程序中,比如服务端响应请求时,可以同时响应多个客户端的请求,但是响应请求的个数(即线程)的个数过多的话就会造成系统资源损耗过多而宕机,还比在做一些下载的程序时,可同时开5个下 ...
- ThreadPool简单使用
线程池的应用比较广泛,主要是让开发人员在开发过程中减少自己创建线程,管理线程的细节. 1.核心线程开始执行 2.还有新任务,就填充到阻塞队列中,等待核心线程执行 3.阻塞队列满了,就开始创建新的线程, ...
- WPF-002 下拉列表的简单实现
最近在一个WPF项目中用到一个下拉列表,随着用户输入字符而进行显示,使用了绑定等知识,虽然实现比较简单,可是在性能上也是想了很多办法终于才勉强可以用,与大家分享下. 用于页面绑定的模型类: publi ...
- 简单读!tomcat源码(一)启动与监听
tomcat 作为知名的web容器,很棒! 本文简单了从其应用命令开始拆解,让我们对他有清晰的了解,揭开神秘的面纱!(冗长的代码流水线,给你一目了然) 话分两头: 1. tomcat是如何启动的? 2 ...
- 一个简单的tcpserver
由于日常使用中经常需要调试tcp客户端程序,因此写了一个简单的tcpserver,能处理多客户端,接收它们的消息,同时对所有客户端发出消息. 为了使得防火墙不跳出警告,只实现对本地3000端口的监听, ...
- C#并行开发_Thread/ThreadPool, Task/TaskFactory, Parallel
大家好,本次讨论的是C#中的并行开发,给力吧,随着并行的概念深入,哥也赶上这个潮流了,其实之前讨论C#的异步调用或者C#中BeginInvoke或者Invoke都已经涉及了部分本篇的内容. 参考书目: ...
- WPF:下拉列表的简单实现
最近在一个WPF项目中用到一个下拉列表,随着用户输入字符而进行显示,使用了绑定等知识,虽然实现比较简单,可是在性能上也是想了很多办法终于才勉强可以用,与大家分享下. 用于页面绑定的模型类: 1 pub ...
- JAVA线程池的简单实现及优先级设置
我们大家都知道,在处理多线程服务并发时,由于创建线程需要占用很多的系统资源,所以为了避免这些不必要的损耗,通常我们采用线程池来解决这些问题. 线程池的基本原理是,首先创建并保持一定数量的线程,当需 ...
- boost之ThreadPool
boost之ThreadPool 标签: threadcallback任务lockingexceptionfunction 2011-04-02 17:59 22258人阅读 评论(3) 收藏 举报 ...
最新文章
- linux后台运行cat命令,Linux程序前台后台切换
- 《深入理解 Java 内存模型》读书笔记(下)(干货,万字长文)
- 为什么要两次调用encodeURI来解决乱码问题
- 第十一节:特性(常见的特性标签、自定义特性、特性的使用案例)
- 余额宝上线新功能,可以跟亲朋好友一起攒钱了
- 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_04 IO字节流_5_文件存储的原理和记事本打开文本显示原理...
- 为啥好多公司面试程序员用纸写代码?不会是因为缺少笔记本电脑吧
- 对于路由地址并未切换,但是地址栏发生地址发生变化原因
- excel怎么设置密码?加密文件这么做!
- 看脸的时代,AI医美为什么没有成为风口?
- 软考高项:信息系统项目管理师笔记-信息化和信息系统 (P2)
- 使用Altium Designer 绘制PCB的详细过程
- “国际软件自由日”头脑风暴成果
- Android跳转淘宝商品详情页代码
- 东莞java外包_酷工作 - [华为外包][东莞松山湖] 智能硬件项目组招人,仿真工程师,硬件工程师等多个岗位总有一款适合你 - 圈子 - SegmentFault 思否...
- MacOS中dyld: Library not loaded的错误修正
- SSM茶叶销售管理系统
- OpenWRT编译失败问题解决(一)
- QEMU搭建arm64 Linux调试环境
- 泛微协同管理应用平台e-cology怎么样?
热门文章
- 工厂用抽象类比接口_用简单的现实类比解释硬编码概念
- php执行mysql insert,当执行mysql insert 时插入两条是咋回事
- android 无法接收广播_别告诉我你不认识Android中广播接收者(二)
- (C++)CSP202006-2 稀疏向量 two pointers
- PMP®考试是什么机构
- Java程序员技术培训需要培训哪些?
- android 系统锁屏音乐播放器,Android实现音乐播放器锁屏页
- 软件开发--深入理解程序的结构
- docker-dockerfile
- 【转】RelativeLayout和LinearLayout及FrameLayout性能分析