Java线程池ThreadPoolExecutor的简单理解

本文详细解析了线程池的工作原理,包括线程池初始化、任务接收与处理流程。介绍了线程池根据核心线程数、最大线程数及任务队列大小调整并发能力的方法。


线程池初始化之后,池中的线程数量为0,接收到任务之后开始创建线程                                                              

                                                                                              
线程池接收任务的过程:                                                                                   
1.如果当前线程池中的线程数量小于CORE_POOL_SIZE,则直接创建线程 mThreadFactory 的 newThread 方法                         
                                                                                              
2.如果当前线程池中的线程数量等于CORE_POOL_SIZE,而且队列mWorkQueue未满,则把任务放入队列                                     
                                                                                              
3.如果当前线程池中的线程数量等于CORE_POOL_SIZE,而且队列mWorkQueue已满,                                             
         则在线程池中创建新线程,线程池中的线程数量增加                                                              
                                                                                              
4.如果当前线程池中的线程数量等于MAXIMUM_POOL_SIZE,并且队列mWorkQueue已满,                                          
         则异常异常:回调RejectedExecutionHandler的rejectedExecution方法                                 
                                                                                              
5.任务执行完之后,线程池中多余的线程(当前数量 - CORE_POOL_SIZE)在KEEP_ALIVE时间后背销毁,                                  
         线程池大小瘦身到 CORE_POOL_SIZE 或小于 CORE_POOL_SIZE                                           
                                                                                              
6.                                                                                            
                                                                                              
所以,线程池的最大并发数为 MAXIMUM_POOL_SIZE                                                               
一定时间内能接受的任务数量为 MAXIMUM_POOL_SIZE + WORK_QUEUE_SIZE                                            
所以可以根据实际需求,调整 CORE_POOL_SIZE MAXIMUM_POOL_SIZE 和 WORK_QUEUE_SIZE                              
                                                                                              
PS:                                                                                           
AsyncTask中实现的  THREAD_POOL_EXECUTOR 的参数根据CPU核心数:                                              
CPU_COUNT = Runtime.getRuntime().availableProcessors();                                       
CORE_POOL_SIZE = CPU_COUNT + 1;                                                               
MAXIMUM_POOL_SIZE = CPU_COUNT * 2 + 1;                                                        
KEEP_ALIVE = 1;                                                                               
任务队列的大小为128                                                                                   
                                                                                              
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值