简易线程池Thread Pool
1. 基本思路
写了个简易的线程池,基本的思路是:
- 有1个调度线程,负责维护WorkItem队列、管理线程(是否要增加工作线程)、调度(把工作项赋给工作线程)等
- 线程数量随WorkItem的量动态调整,超时后自动退出
- 可以从WorkItem里拿到结果,并执行取消等动作
2. 设计点
需要考量的地方如下:
- 是否要设置1个单独的调度线程?如果不设置,那么只能在工作项Enqueue的时候,根据繁忙程度决定是否生成新的线程。如果短时间内涌入大量工作项,并且都是短工作项(执行时间<1s),则会一下子生成一大堆idle线程。SmartThreadPool里就是这么设计的。
- 我的选择是,增加1个单独的调度线程。默认每1秒调度1次,避免工作项一直等待,也避免工作项太多时线程增长太快。
- 工作线程放在1个堆栈里,保证后进先出,即越是使用频繁的线程,越是经常用它。越是休息的久的线程,越是不让它干活。这样空闲的线程会尽快退出,减少了资源的占用和CPU的调度。
- MinThread在线程池初始化时生成,永不退出。是否应该在第1个工作项Enqueue的时候,再生成MinThread呢?目前是固定某个线程为MinThread,是否应该不固定,只保证Minimun的线程数量?
- 工作项队列是否需要有长度限制?我设定为默认1k,有丢弃策略,默认是不丢弃,这时会忽略长度限制。
- 目前线程的名字是当前正在执行的工作项的名字,这是为了调试方便。理想的情况是,随时可以打印1个snapshot,展现线程池里的所有状态,哪些线程空闲、另一些在执行哪些工作项等。
3. 与SmartThreadPool的比较
当然,目前功能上还非常简单,可以作为线程池入门级的学习参考。比如以下功能都没有实现:
- 不能控件Thread和WorkItem的Priority
- 不能设置Thread的Background、ApartmentState、StackSize(当然这个很容易添加)
- 没有PerformanceCounter(这个就不太容易了)
- 没有对WorkItem和State的释放(Dispose)
- 没有延迟执行PostExecute、也没有StartSuspended等
- 没有暴露足够的属性和事件,不易于外部了解线程池内的运行状态和注册事件处理方法
简易线程池Thread Pool的更多相关文章
- C#多线程实现方法——线程池(Thread Pool)
ThreadPool使用 同步机制 ThreadPool使用 需要定义waitcallback委托形式如 public delegate void WaitCallback(object stat ...
- MySQL线程池(THREAD POOL)的原理
MySQL常用(目前线上使用)的线程调度方式是one-thread-per-connection(每连接一个线程),server为每一个连接创建一个线程来服务,连接断开后,这个线程进入thread_c ...
- 线程池 (thread pool) 的类型与实现方式
在许多应用中需要频繁的创建许多生命周期很短的线程,如果用传统方法的话就会造成大量的资源了浪费,java的设计者们考虑到了这点在java中加入了线程池这个特性,它负责管理大量的线程的创建销毁等操作. 首 ...
- 使用boost实现线程池thread pool | boost thread pool example
本文首发于个人博客https://kezunlin.me/post/f241bd30/,欢迎阅读! boost thread pool example Guide boost thread pool ...
- Linux下简易线程池
线程池简介 线程池是可以用来在后台执行多个任务的线程集合. 这使主线程可以自由地异步执行其他任务.线程池通常用于服务器应用程序. 每个传入请求都将分配给线程池中的一个线程,因此可以异步处理请求,而不会 ...
- 用java自制简易线程池(不依赖concurrent包)
很久之前人们为了继续享用并行化带来的好处而不想使用进程,于是创造出了比进程更轻量级的线程.以linux为例,创建一个进程需要申请新的自己的内存空间,从父进程拷贝一些数据,所以开销是比较大的,线程(或称 ...
- 基于Win32 SDK实现的一个简易线程池
利用C++实现了一个简易的线程池模型(基于Win32 SDK),方便使用多线程处理任务.共包含Thread.h.Thread.cpp.ThreadPool.h.ThreadPool.cpp四个源文件. ...
- MySQL--线程池(Thread Pool)
================================================================= 线程池技术 在MySQL社区版中,MySQL使用one-thread ...
- Spring中的定时调度(Scheduling)和线程池(Thread Pooling)
使用triggers和SchedulerFactoryBean来包装任务 我们已经创建了job details,jobs.我们同时回顾了允许你调用特定对象上某一个方法的便捷的bean. 当然我们仍需要 ...
随机推荐
- HTML5 LocalStorage 本地存储原理详解
首先自然是检测浏览器是否支持本地存储.在HTML5中,本地存储是一个window的属性,包括localStorage和sessionStorage,从名字应该可以很清楚的辨认二者的区别,前者是一直存在 ...
- Arduino入门笔记【1】
刚刚接触这个东西只知道这是类似于单片机的开发板,可以做一些单片机实现或者不能实现的东西,但是比单片机要简单得多. Arduino到底是什么? 维基百科上的描述是:Arduino是一块开发板的微控制器和 ...
- KEEPALIVED
keepalived 一.原理: 功能:能够自动实现将用户访问的ip转移的方法,故障重启,故障,恢复切换,故障报警 模型:Master/Backup 使用场景:节点少,没有共享存储等等.他只能有一个主 ...
- tcpdump用法
http://man.linuxde.net/tcpdump http://www.cnblogs.com/yc_sunniwell/archive/2010/07/05/1771563.html
- MFC编程入门之二十三(常用控件:按钮控件的编程实例)
上一节讲了按钮控件Button.Radio Button和Check Box的基本用法,本节继续讲按钮控件的内容,通过一个实例让大家更清楚按钮控件在实际的软件开发中如何使用. 因为Button控件在前 ...
- C# 发送qq邮箱
注意: QQ邮箱的简单邮件传输协议(SMTP)使用了SSL加密,必须启用SSL加密.指定端口. QQ邮箱POP3/SMTP服务默认是关闭的,需要开启服务(设置=>账户=>开启服务). QQ ...
- SQL Server Reporting Service(SSRS) 第二篇 SSRS数据分组Parent Group
SQL Server Reporting Service(SSRS) 第一篇 我的第一个SSRS例子默认使用Table进行简单的数据显示,有时为了进行更加直观的数据显示,我们需要按照某个字段对列表进行 ...
- excel读取
一.jar包 二.工具类 package excel; import java.io.FileInputStream; import java.io.FileNotFoundException; im ...
- 解决Gradle编译时出现: 编码GBK的不可映射字符
解决Gradle编译时出现: 编码GBK的不可映射字符 在build.gradle文件中加入如下内容: [compileJava, compileTestJava]*.options*.encodin ...
- 实现View的移动的方法总结
btw:这篇博客的内容其实算是<Android开发艺术探索>的一篇读书笔记,在书本的知识上加了一点自己的理解,并用自己的话描述出来.<Android开发艺术探索>是一本不错的书 ...