线程池构造参数有8个,但是最核心的是3个:corePoolSize、maximumPoolSize,workQueue,它们最大程度地决定了线程池的任务分配和线程分配策略。
    考虑到在实际应用中用到并发性的场景主要是两种:
    (1)并行执行子任务,提高响应速度。这种情况下,应该使用同步队列,没有什么任务应该被缓存下来,而是应该立即执行。
    (2)并行执行大批次任务,提升吞吐量。这种情况下,应该使用有界队列,使用队列去缓冲大批量的任务,队列容量必须声明,防止任务无限制堆积。

    线程池中比较关键的就是线程数数量的设置,参考了《java并发编程的艺术》Nthreads = Ncpu x Ucpu x (1 + W/C),性能监控工具:https://zhuanlan.zhihu.com/p/65325962 Jprofiler cpu视图可以计算出 各个函数的 CPU 占用时间。
    但是实际上生产环境中有其他线程的影响,很难评估任务的计算时间C和等待时长W。另外一张计算方法,核心线程数=tps*time,有时候流程不均匀的情况下,也不是非常合理。并发任务的执行情况和任务类型相关,IO密集型和CPU密集型的任务运行起来的情况差异非常大,但这种占比是较难合理预估的,这导致很难有一个简单有效的通用公式帮我们直接计算出结果。
    解决这个问题的思路:
    (1)增加线程池监控:在线程池执行任务的生命周期添加监控能力,帮助开发同学了解线程池状态,有问题时能够报警。
    (2)参数可动态修改:收到报警后怎么处理呢? 参数可动态修改:允许线程池监听同步外部的消息,根据消息进行修改线程池配置。