线程池实现源码:

java 线程池个数 java线程池oom_线程池

1)源码截图

java 线程池个数 java线程池oom_线程池_02

2)流程示意

主要参数介绍:

1、corePoolSize :线程池中保持的最少线程数量,即使这些线程处理空闲状态,他们也不会被销毁,只有设置了allowCoreThreadTimeOut=true时才会销毁核心线程

2、maximumPoolSize :即线程池最大允许的全部线程的数量。根据上述流程图的示意,一个任务提交后,当且仅当队列已满、且线程总数没有超出maximumPoolSize的限制,则会新建一个临时线程。如果工作队列满,且线程数等于最大线程数,此时再提交任务则会调用拒绝策略

3、keepAliveTime 非核心线程空闲时存活时间,是针对当且仅当队列已满、且线程总数没有超出maximumPoolSize的限制时新建的临时线程(个人方便理解)有效的,即默认情况下,只有当线程池中的线程数大于corePoolSize时,keepAliveTime才会起作用,直到线程中的线程数小于等于corepoolSIze,

4、unit : 临时线程存活时间单位,有秒、毫秒等;

5、workQueue:任务等待被执行时的保存区。常用工作队列有以下几种,包括:

        1)ArrayBlockingQueue:有界队列,需要设置大小,按FIFO排序(先进先出),新任务会被放置队尾,当线程数量已经达到maxPoolSize,则会执行拒绝策略。

        2)LinkedBlockingQueue:默认容量大小为Integer.Max_VALUE ,视为无界队列,按 FIFO 排序任务,可以设置容量(变成有界队列) 。无界情况下,参数maxPoolSize无用。创建线程池的工厂方法 Executors.newSingleThreadExecutor、Executors.newFixedThreadPool就是使用了此队列。

        3)SynchronousQueue:即没有存储队列的地方,提交任务后立即执行,无可用线程则新建,达到maxPoolSize后调用拒绝策略, Executors.newCachedThreadPool 所创建的线程池使用此队列,特点是不保存任务

        4)PriorityBlockingQueue:任务带有优先级,优先级通过参数Comparator实现。

        5) DelayQueue:无界,基于 PriorityBlockingQueue 实现,队列中每个元素都有过期时间,当从队列获取元素(元素出队)时,只有已经过期的元素才会出队,而队列头部的元素是过期最快的元素。快捷工厂方法 Executors.newScheduledThreadPool 所创建的线程池使用此队列。

:Java 中的阻塞队列(BlockingQueue)与普通队列相比,在阻塞队列为空时,会阻塞当前线程的元素获取操作,直到阻塞队列中有了元素

6、threadFactory :创建一个线程工厂用来创建线程,可以用来设定线程名、是否为daemon线程等等

7、handler 拒绝策略

        1)AbortPolicy:默认配置,丢弃任务并抛出 RejectedExecutionException 异常;

        2)DiscardPolicy:丢弃任务,但是不抛出异常;

        3)DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程) 。也就是当任务被拒绝添加时,会抛弃任务队列中最旧的任务也就是最先加入队列的,再把这个新任务从队尾添加进去,等待执行。

        4)CallerRunsPolicy:谁调用,谁处理。由调用线程(即提交任务给线程池的线程)处理该任务,如果线程池已经被shutdown则直接丢弃;