JVM 在hostSpot 的线程模型下,java 线程会一对一映射为内核线程,这意味着,在java
    中每次创建以及回收线程都会内核建以回收
    这就有可能导致: 常见和销毁线程所花费的时间和资源可能比处理的任务花费的时间和资源要更多
    线程池的出现是为了提高线程的复用性以及固定线程的数量

    那么项目中如何运用线程池呢?
    我所负责的项目是消息管理平台,提供其中的一个功能就是: 运用会圈定人群,然后群发消息。

    主要流程大概就是: 创建模板——》定时——》群发消息-》用户收到消息,运营圈定的人群实际上在模板上
    只是一个id,我这边要通过id 去获取到Hdfs 文件,对HDfs 文件进行遍历,然后继续往下

    【接收到定时任务,再对Hdfs 进行遍历】这里的处理,用的就是线程池处理

    那么为什么要选择要用线程池呢?
    HDfs 遍历其实就是IO 的操作,我把这个过程给异步化,为了提高系统的吞吐量,于是我这里用的线程池,即便遍历
    HDFS 出现问题,我这边都有完备的监控和告警可以及时发现

    那么有人问,应该如何去创建呢? 是用EXecutors 去创建的吗?
    其实并不是,这边用的是ThreadPoolExecutor 去创建线程池。阿里巴巴开发手册提到。不要使用Exectors 去创建线程,使用ThreadPoolExecutor 创建的线程你更能了解线程池运行的规则,避免资源耗尽的风险。
    ThreadExexcutor在构造的时候有几个重要 的参数。分别是:corePoolSize(核心线程数量)、maximumPoolSize(最大线程数量)、keepAliveTime(线程空余时间)、workQueue(阻塞队列)、handler(任务拒绝策略)

    任务提交的流程:(1)首先会判断运行线程数是否小于corePoolSize,如果小于, 则直接创建新的线程执行任务
    (2)如果大于corePoolSize,判断workQueue阻塞队列是否已满,如果还没有满,则将任务放到阻
    塞队列中
    (3)如果workQueue阻塞队列已经满了,则判断当前线程数是否大于maximunPoolSize,如果
    没大于则创新新的线程执行任务
    (4)如果大于maximunPoolSize,则执行任务拒绝策略