ExecutorService 通过服务线程中的一个来执行任务,ExecutorService通过Executors的工场方法进行配置
ThreadPoolExecutor解决两种不同的问题,当解决大量的异步任务的时候可以提升性能,因为减少了每一个任务的文件调取,提供了管理资源和线程的方法。线程池也会保存一些常量,比如执行任务的数量
为了能更有效的适应更广泛的使用场景,ThreadPoolExecutor提供了可调节性的参数,以及可拓展的hooks。不论怎么,程序员会更愿意去用更方便的Executors的工场方法,
如果提交任务的数量小于核心线程数量,会创建一个新的工作线程去处理任务,即使别的工作线程正在空转。如果当前运行的线程数量大于核心线程数量小于最大的线程数量,只有当队列已满的时候会创建新线程。当设定核心线程数和设定最大线程数相同时候,当前线程池就是一个 fixed-size 线程池。核心线程数和最大线程数可以通过方法动态设定。
默认的情况下,工作线程是当新任务到达的时候初始化和创建,但是这个规则可以通过动态重写方法prestartCoreThread 和方法 prestartAllCoreThread,当你创建一个非空的任务队列的时候,可能会希望提前启动线程。
如果没有特别的设定,新的线程会通过ThreadFactory创建,而通过ThreadFactory创建的线程会同属于一个线程组,都是一个优先级,以及都不是一个都不是守护线程,如果ThreadFactory通过newThread方法创建线程失败会返回null。
如果线程池当前的线程数量超过核心线程数量,如果超过核心线程数量的线程被闲置的时间超过keepAliveTime
,超过数量的线程会被终止,以减少资源的消耗,keepAliveTime
可以通过方法setkeepAliveTime()
改变,核心线程也可以设置超时策略,但是必须得通过方法allowCoreThreadTimeout(boolean )
设置,且keepAliveTime
不能为0
一个BlockingQueue
会被创建用来存储等待执行的任务,队列大小收线程的核心线程数影响
如果正在运行的线程数小于corePoolSize
,线程池更愿意将任务入队列,而不是创建新线程,当新来一个任务时候如果正在运行的线程数大于maximumPoolSize
,新的任务会被拒绝执行
总体有三种排队策略
- SynchronizedQueue;
- LinkedBlockingQueue;
- ArrayBlockingQueue;
网友评论