现状
java原生线程池的原理:
- 如果在线程池中的线程数量没有达到核心的线程数量,这时候就回启动一个核心线程来执行任务。
- 如果线程池中的线程数量已经超过核心线程数,这时候任务就会被插入到任务队列中排队等待执行。
- 由于任务队列已满,无法将任务插入到任务队列中。这个时候如果线程池中的线程数量没有达到线程池所设定的最大值,那么这时候就会立即启动一个非核心线程来执行任务。
- 如果线程池中的数量达到了所规定的最大值,那么就会拒绝执行此任务,这时候就会调用RejectedExecutionHandler中的rejectedExecution方法来通知调用者。
架构图:
需求
但是Android上实际使用时,希望核心线程数两三个,最大线程数五六个,并且在任务较多时优先新建线程,而不是放队列,当队列都放不下才拒绝,很明显java自带线程池不满足需求。当前队列如果小了那么很容易触发拒绝策略,但是大多数情况下不能拒绝也不能阻塞,因此队列容量一般较大,那么此时基本上全靠核心线程数,也就是线程池无法动态扩容,虽然线程池支持动态设置核心线程数,但是需要使用者动态检测。
目前解决方法是设置较大核心线程数,但是如果核心线程数较大,其实很多时候是浪费资源的。
期望
本来准备找一下资料,感觉这个需求应该比较普遍,但是大概检索了一下,没有发现好的框架,后续再仔细搜索一下,或者自行实现。
有个错字啊,棉棉。“这时候就回启动一个核心线程”,里面说的是“会”吧?