1. 基本思路

写了个简易的线程池,基本的思路是:

  1. 有1个调度线程,负责维护WorkItem队列、管理线程(是否要增加工作线程)、调度(把工作项赋给工作线程)等
  2. 线程数量随WorkItem的量动态调整,超时后自动退出
  3. 可以从WorkItem里拿到结果,并执行取消等动作

2. 设计点

需要考量的地方如下:

  1. 是否要设置1个单独的调度线程?如果不设置,那么只能在工作项Enqueue的时候,根据繁忙程度决定是否生成新的线程。如果短时间内涌入大量工作项,并且都是短工作项(执行时间<1s),则会一下子生成一大堆idle线程。SmartThreadPool里就是这么设计的。
  2. 我的选择是,增加1个单独的调度线程。默认每1秒调度1次,避免工作项一直等待,也避免工作项太多时线程增长太快。
  3. 工作线程放在1个堆栈里,保证后进先出,即越是使用频繁的线程,越是经常用它。越是休息的久的线程,越是不让它干活。这样空闲的线程会尽快退出,减少了资源的占用和CPU的调度。
  4. MinThread在线程池初始化时生成,永不退出。是否应该在第1个工作项Enqueue的时候,再生成MinThread呢?目前是固定某个线程为MinThread,是否应该不固定,只保证Minimun的线程数量?
  5. 工作项队列是否需要有长度限制?我设定为默认1k,有丢弃策略,默认是不丢弃,这时会忽略长度限制。
  6. 目前线程的名字是当前正在执行的工作项的名字,这是为了调试方便。理想的情况是,随时可以打印1个snapshot,展现线程池里的所有状态,哪些线程空闲、另一些在执行哪些工作项等。

3. 与SmartThreadPool的比较

当然,目前功能上还非常简单,可以作为线程池入门级的学习参考。比如以下功能都没有实现:

  • 不能控件Thread和WorkItem的Priority
  • 不能设置Thread的Background、ApartmentState、StackSize(当然这个很容易添加)
  • 没有PerformanceCounter(这个就不太容易了)
  • 没有对WorkItem和State的释放(Dispose)
  • 没有延迟执行PostExecute、也没有StartSuspended等
  • 没有暴露足够的属性和事件,不易于外部了解线程池内的运行状态和注册事件处理方法

简易线程池Thread Pool的更多相关文章

  1. C#多线程实现方法——线程池(Thread Pool)

    ThreadPool使用 同步机制   ThreadPool使用 需要定义waitcallback委托形式如 public delegate void WaitCallback(object stat ...

  2. MySQL线程池(THREAD POOL)的原理

    MySQL常用(目前线上使用)的线程调度方式是one-thread-per-connection(每连接一个线程),server为每一个连接创建一个线程来服务,连接断开后,这个线程进入thread_c ...

  3. 线程池 (thread pool) 的类型与实现方式

    在许多应用中需要频繁的创建许多生命周期很短的线程,如果用传统方法的话就会造成大量的资源了浪费,java的设计者们考虑到了这点在java中加入了线程池这个特性,它负责管理大量的线程的创建销毁等操作. 首 ...

  4. 使用boost实现线程池thread pool | boost thread pool example

    本文首发于个人博客https://kezunlin.me/post/f241bd30/,欢迎阅读! boost thread pool example Guide boost thread pool ...

  5. Linux下简易线程池

    线程池简介 线程池是可以用来在后台执行多个任务的线程集合. 这使主线程可以自由地异步执行其他任务.线程池通常用于服务器应用程序. 每个传入请求都将分配给线程池中的一个线程,因此可以异步处理请求,而不会 ...

  6. 用java自制简易线程池(不依赖concurrent包)

    很久之前人们为了继续享用并行化带来的好处而不想使用进程,于是创造出了比进程更轻量级的线程.以linux为例,创建一个进程需要申请新的自己的内存空间,从父进程拷贝一些数据,所以开销是比较大的,线程(或称 ...

  7. 基于Win32 SDK实现的一个简易线程池

    利用C++实现了一个简易的线程池模型(基于Win32 SDK),方便使用多线程处理任务.共包含Thread.h.Thread.cpp.ThreadPool.h.ThreadPool.cpp四个源文件. ...

  8. MySQL--线程池(Thread Pool)

    ================================================================= 线程池技术 在MySQL社区版中,MySQL使用one-thread ...

  9. Spring中的定时调度(Scheduling)和线程池(Thread Pooling)

    使用triggers和SchedulerFactoryBean来包装任务 我们已经创建了job details,jobs.我们同时回顾了允许你调用特定对象上某一个方法的便捷的bean. 当然我们仍需要 ...

随机推荐

  1. OpenCV2+入门系列(一):OpenCV2.4.9的安装与测试

    这里假设看到这篇文章的人都已经对OpenCV以及机器视觉等最基础的概念有了一定的认识,因此本文不会对OpenCV做任何的介绍,而是直接介绍OpenCV2.4.9的安装与测试.此外本文只是简单的介绍如何 ...

  2. python走起之第十七话

    选择器 #id 概述 根据给定的ID匹配一个元素. 使用任何的元字符(如 !"#$%&'()*+,./:;<=>?@[\]^`{|}~)作为名称的文本部分, 它必须被两个 ...

  3. iOS自动化编译方案

    本文主要来源以下Bryce Zhang博主的文章,感谢博主的无私分享,转载请注明出处,尊重原创 然,根据Bryce Zhang文章进行实践过程中遇到一些问题,解决后在此做相应的总结.大神请绕道,觉得低 ...

  4. 命名空间$.fn

    $.fn.xxx是可以用对象来调用的命名空间,例如 $.fn.input() 在声明时就可以用 $('abc').input()    $.fx是指jquery的特效. 如果使用显示.滑动.淡入淡出. ...

  5. Control.DataBinding数据绑定简单用法:

    DataBindings的用法: 第一个值:要绑定到TextBox的什么地方 第二个值:数据源是什么 第三个值:应该取数据源的什么属性 第四个值:是否开启数据格式化 第五个值:在什么时候启用数据源绑定 ...

  6. 01.JavaScript 面向对象精要--原始类型和引用类型

    一.什么是类型 JavaScript 虽然没有类的概念.但依然存在两种类型:原始类型和应用类型. 原始类型保存为简单的数据值,引用类型则保存为对象,其本质是指向内存位置 的引用.也就是说:原始值被直接 ...

  7. Docker实践,来自沪江、滴滴、蘑菇街架构师的交流分享

    架构师小组交流会:每期选一个时下最热门的技术话题进行实践经验分享. 第一期主题:容器实践.Docker 作为当前最具颠覆性的开源技术之一,其轻量虚拟化.可移植性是CI/CD,DevOps,微服务的重要 ...

  8. a.redhat系统如何卸载默认jdk

    Redhat系统安装之后,会默认有openjdk在安装(下图已经是卸载掉了) 这个openjdk下面的需要进行卸载,你可以通过命令进行卸载,例如首先查看JDK,然后默认直接通过rpm命令进行卸载L 卸 ...

  9. x-csrf-token

  10. Java中Sting类型对象内容不可改变

    String拥有一个特殊点叫:String对象的内容不可改变!   在调用诸如String对象的replace()等方法时,不是在原Sting对象的基础上改变对象内容,而是创建了一个新的String对 ...