Skip to content

Latest commit

 

History

History
16 lines (16 loc) · 2.57 KB

线程池.md

File metadata and controls

16 lines (16 loc) · 2.57 KB

ThreadPoolExecutor

  • 类图 线程池类图 任务添加流程

    任务添加过程

    线程池主要参数
    • corePoolSize 核心线程数,线程池中维持的最小线程数量。即使这些线程处于空闲状态,他们也不会被销毁。除非设置了allowCoreTheadTimeout,任务添加时首先会检查当前工作线程数是否达到了corePoolSize,如果没有达到则新建一个线程来处理。
    • maximumPoolSize 最大线程数,当前线程数达到corePoolSize时,如果继续有任务被提交,则添加到工作队列中,如果工作队列已满,则创建一个新的线程来处理刚提交的这个任务,但线程不能无限次创建maximumPoolSize 限制的就是这个数量。
    • keepAliveTime 当线程已经处理完任务,而且线程数超过了corePoolSize,则多余的线程在超过keepAliveTime后就会被回收。
    • unit keepAliveTime 空闲线程存活时间单位。

    我们以管理一个技术团队做举例:团队中有几个核心技术,是不能被辞掉的。称为corePoolSize,刚开始工作不多,他们每个人可以分到一个任务去做,后来随着任务超过了核心技术的数量,技术负责人说你这个需求得排队,于是新来的任务便被放到队列中。再后来,队列都放满了。技术负责人给hr说你得再找几个打下手的。但由于成本的考虑只能找maximumPoolSize-corePoolSize的数量的人,若果任务量大于workQueue.size() + maximumPoolSize,技术负责人说你这活我这么多人实在做不下去,所以会按照拒绝策略中设置的策略去拒绝或者重新执行任务。

    • 任务拒绝策略: 拒绝策略提供顶级接口 RejectedExecutionHandler,其中 rejectedExecution 即定制具体的拒绝策略的执行逻辑 callRunsPolicy 当触发拒绝策略且线程池没有关闭时,调用线程执行任务,一般用在并发比较小,不允许失败的场合,如果失败次数过多,失败提交比较频繁则会造成程序阻塞。 abortPolicy 丢弃任务,并抛出 RejectExecutionException异常,线程池默认的策略,必须处理好抛出的异常,否则会打断当前的执行,影响后续任务的执行 DiscardPolicy 直接丢弃,不抛异常 DiscardOldestPolicy 如果线程池没有关闭,则丢弃线程池任务队列中最老的一个任务,并将新任务加入