由于最近需要用多线程处理一些问题,一开始我用了.net默认的ThreadPool,感觉不是很适合。于是我自己实现了一个简单的ThreadPool。

写的比较简单,有兴趣的朋友一起看看,共同改进。

代码主要由ThreadPoolEx,WorkItem,WorkQueue组成。

推荐使用新版本:http://www.cnblogs.com/ITAres/archive/2009/08/25/1553800.html

ThreadPoolEx
  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
WorkItem
 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
WorkQueue
 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实现相关推荐

  1. 简单使用Boost线程池threadpool

    场景: 1.在一些多线程的程序中,比如服务端响应请求时,可以同时响应多个客户端的请求,但是响应请求的个数(即线程)的个数过多的话就会造成系统资源损耗过多而宕机,还比在做一些下载的程序时,可同时开5个下 ...

  2. ThreadPool简单使用

    线程池的应用比较广泛,主要是让开发人员在开发过程中减少自己创建线程,管理线程的细节. 1.核心线程开始执行 2.还有新任务,就填充到阻塞队列中,等待核心线程执行 3.阻塞队列满了,就开始创建新的线程, ...

  3. WPF-002 下拉列表的简单实现

    最近在一个WPF项目中用到一个下拉列表,随着用户输入字符而进行显示,使用了绑定等知识,虽然实现比较简单,可是在性能上也是想了很多办法终于才勉强可以用,与大家分享下. 用于页面绑定的模型类: publi ...

  4. 简单读!tomcat源码(一)启动与监听

    tomcat 作为知名的web容器,很棒! 本文简单了从其应用命令开始拆解,让我们对他有清晰的了解,揭开神秘的面纱!(冗长的代码流水线,给你一目了然) 话分两头: 1. tomcat是如何启动的? 2 ...

  5. 一个简单的tcpserver

    由于日常使用中经常需要调试tcp客户端程序,因此写了一个简单的tcpserver,能处理多客户端,接收它们的消息,同时对所有客户端发出消息. 为了使得防火墙不跳出警告,只实现对本地3000端口的监听, ...

  6. C#并行开发_Thread/ThreadPool, Task/TaskFactory, Parallel

    大家好,本次讨论的是C#中的并行开发,给力吧,随着并行的概念深入,哥也赶上这个潮流了,其实之前讨论C#的异步调用或者C#中BeginInvoke或者Invoke都已经涉及了部分本篇的内容. 参考书目: ...

  7. WPF:下拉列表的简单实现

    最近在一个WPF项目中用到一个下拉列表,随着用户输入字符而进行显示,使用了绑定等知识,虽然实现比较简单,可是在性能上也是想了很多办法终于才勉强可以用,与大家分享下. 用于页面绑定的模型类: 1 pub ...

  8. JAVA线程池的简单实现及优先级设置

    我们大家都知道,在处理多线程服务并发时,由于创建线程需要占用很多的系统资源,所以为了避免这些不必要的损耗,通常我们采用线程池来解决这些问题.   线程池的基本原理是,首先创建并保持一定数量的线程,当需 ...

  9. boost之ThreadPool

    boost之ThreadPool 标签: threadcallback任务lockingexceptionfunction 2011-04-02 17:59 22258人阅读 评论(3) 收藏 举报 ...

最新文章

  1. linux后台运行cat命令,Linux程序前台后台切换
  2. 《深入理解 Java 内存模型》读书笔记(下)(干货,万字长文)
  3. 为什么要两次调用encodeURI来解决乱码问题
  4. 第十一节:特性(常见的特性标签、自定义特性、特性的使用案例)
  5. 余额宝上线新功能,可以跟亲朋好友一起攒钱了
  6. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_04 IO字节流_5_文件存储的原理和记事本打开文本显示原理...
  7. 为啥好多公司面试程序员用纸写代码?不会是因为缺少笔记本电脑吧
  8. 对于路由地址并未切换,但是地址栏发生地址发生变化原因
  9. excel怎么设置密码?加密文件这么做!
  10. 看脸的时代,AI医美为什么没有成为风口?
  11. 软考高项:信息系统项目管理师笔记-信息化和信息系统 (P2)
  12. 使用Altium Designer 绘制PCB的详细过程
  13. “国际软件自由日”头脑风暴成果
  14. Android跳转淘宝商品详情页代码
  15. 东莞java外包_酷工作 - [华为外包][东莞松山湖] 智能硬件项目组招人,仿真工程师,硬件工程师等多个岗位总有一款适合你 - 圈子 - SegmentFault 思否...
  16. MacOS中dyld: Library not loaded的错误修正
  17. SSM茶叶销售管理系统
  18. OpenWRT编译失败问题解决(一)
  19. QEMU搭建arm64 Linux调试环境
  20. 泛微协同管理应用平台e-cology怎么样?

热门文章

  1. 工厂用抽象类比接口_用简单的现实类比解释硬编码概念
  2. php执行mysql insert,当执行mysql insert 时插入两条是咋回事
  3. android 无法接收广播_别告诉我你不认识Android中广播接收者(二)
  4. (C++)CSP202006-2 稀疏向量 two pointers
  5. PMP®考试是什么机构
  6. Java程序员技术培训需要培训哪些?
  7. android 系统锁屏音乐播放器,Android实现音乐播放器锁屏页
  8. 软件开发--深入理解程序的结构
  9. docker-dockerfile
  10. 【转】RelativeLayout和LinearLayout及FrameLayout性能分析