线程池七大核心参数
1.corePoolSize(核心线程数)
2.maxPoolSize(最大线程数)
3.keepAliveTime(空闲回收时间)
4.unit(回收时间单位)
5.workQueue(任务队列)
6.threadFactory(线程工厂,用于创建线程,一般为默认线程工厂即可)
7.handler(拒绝策略)
当调用 execute(()方法添加一个请求任务时,线程池会做如下判断::
当创建线程任务数小于核心线程数corePoolSize时则直接创建执行,当创建线程任务数大于核心线程数时则加入任务队列workQueue中
(常用的任务队列有 有界队列:1.ArrayBlockingQueue,2.SynchronousQueue,
无界队列:1.LinkedBlockingQueue,暂不详述。)等待,
当任务队列也放满之后查看是否大于最大线程数maxPoolSize,如果这时候队列满了且正在运行的线程数量还小于 naximumPoolSize,,那么还是要创建非核心线程立刻运行这个任务,如果大于最大线程数则执行拒绝策略handler
(拒绝策略有分为四种:
1. CallerRunsPolicy :这个策略重试添加当前的任务,他会自动重复调用 execute() 方法,直到成功。
2. AbortPolicy :对拒绝任务抛弃处理,并且抛出异常。
3. DiscardPolicy :对拒绝任务直接无声抛弃,没有异常信息。
4. DiscardOldestPolicy :对拒绝任务不抛弃,而是抛弃队列里面等待最久的一个线程,然后把拒绝任务加到队列。
)如果没有则创建执行。当一个线程完成任务时,它会从队列中取下一个任务来执行。当一个线程无事可做超过一定的时间( keepAliveTime))时,线程池会判断:如果当前运行的线程数大于 corePoolSize,,那么这个线程就被停掉。所以线程池的所有任务完成后它最终会收缩到 corePoolSize的大小。