线程池的参数

public ThreadPoolExecutor(  int corePoolSize,

                            int maximumPoolSize,

                            long keepAliveTime,

                            TimeUnit unit,

                            BlockingQueue workQueue,

                            ThreadFactory threadFactory,

                            RejectedExecutionHandler handler) { … }

1 corePoolSize 核心线程数

核心线程会一直存活,即使没有任务需要执行。当线程数小于核心线程数时,即使线程池有存在空闲的线程,线程池也会优先创建新线程处理。设置allowCoreThreadTimeout=true(默认false)时,核心线程会超时关闭。

2 maximumPoolSize 最大线程数

当线程数>=corePoolSize,且任务队列已满时。线程池会创建新线程来处理任务。 当线程数=maxPoolSize,且任务队列已满时,线程池会拒绝处理任务而抛出异常。

3 keepAliveTime 线程空闲时间

当线程空闲时间达到keepAliveTime时,线程会退出,直到线程数量=corePoolSize。 如果allowCoreThreadTimeout=true,则会直到线程数量=0。

4 TimeUnit 时间单位

一般是MILLISECONDS,SECONDS,MINUTES,线程空闲时间的单位

5 workQueue 等待队列

blockingQueue(FIFO,先进先出)

阻塞体现在两方面

入队时:如果队列空间已满,数据不会消失,等到空间有容纳余地才会入队

出队时:取数据如果队列中没有数据可取,则会等到有入队数据才可以取出

 

 

 

BlockingQueue是个接口,有如下实现类:

5.1 有界队列 ArrayBlockQueue:一个由数组支持的有界阻塞队列。此队列按 FIFO(先进先出)原则对元素进行排序。创建其对象必须明确大小,像数组一样。

5.2 无界队列 LinkedBlockQueue:一个可改变大小的阻塞队列。此队列按 FIFO(先进先出)原则对元素进行排序。创建其对象如果没有明确大小(如果明确大小就是有界队列),默认值是Integer.MAX_VALUE(此处会造成极大的内存占用,要特别留意)。链接队列的吞吐量通常要高于基于数组的队列,但是在大多数并发应用程序中,其可预知的性能要低。

5.3 优先队列(按优先级排序) PriorityBlockingQueue:类似于LinkedBlockingQueue,但其所含对象的排序不是FIFO,而是依据对象的自然排序顺序或者是构造函数所带的Comparator决定的顺序。

5.4 同步移交队列 SynchronousQueue:同步队列。同步队列没有任何容量,每个插入必须等待另一个线程移除,反之亦然。

6 threadFactory 线程工厂类

为线程池提供创建新线程的线程工厂。

7 RejectedExecutionHandler 拒绝策略

表示当拒绝处理任务时的策略,有以下四种取值:

AbortPolicy:丢弃任务并抛出RejectedExecutionException异常。

DiscardPolicy:也是丢弃任务,但是不抛出异常。

DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程)

CallerRunsPolicy:由调用线程处理该任务

posted on 2022-12-14 14:16  xue123  阅读(182)  评论(0编辑  收藏  举报