1. 线程池主要处理流程
1)判断核心线程池corePoolSize是否已满,如果不是则创建一个新的线程来执行任务(需要获得全局锁);如果都在执行任务,则进入下一个流程
2)判断工作队列BlockingQueue(如有界队列,同步队列,优先级队列等)是否已满,未满则放入队列中;已满则进入下一个流程(线程池里面的线程执行完手上的任务后,会来读取队列中的任务进行执行)
3)判断线程池(maximumPoolSize)的现场是否已满,未满则创建一个新线程来执行任务(需要获得全局锁);已满则交给饱和策略(RejectedExecutionHandler)来处理
2. ThreadPoolExecutor采取上面步骤的总体思路是尽量避免获取锁,一般都会将线程放入队列即可
3. 合理配置线程池,根据任务的性质是cpu密集型还是IO密集型,任务优先级,执行时间,依赖性等。如CPU密集型则尽量少配置线程数,IO密集型尽量多配置线程数,混合型可以考虑拆分,任务优先级的可以考虑用优先级队列等。尽量使用有界队列。