Java知识点记录-ThreadPoolExecutor参数说明

ThreadPoolExecutor的构造函数之一,几个参数的含义

public ThreadPoolExecutor(int corePoolSize,
                          int maximumPoolSize,
                          long keepAliveTime,
                          TimeUnit unit,
                          BlockingQueue<Runnable> workQueue,
                          ThreadFactory threadFactory,
                          RejectedExecutionHandler handler)
ThreadPoolExecutor是用来创建包含一个或多个线程来执行一系列任务用的。
用户只需要指定好参数创建ThreadPoolExecutor,然后在把需处理的任务(包装成Runnable或Callable对象),提交给这个Executor来执行(通过调用excute或submit方法)。

corePoolSize:  指定核心线程数。所谓的核心线程,其实就是这个Executor里面的一个普通线程。只是按照ThreadPoolExecutor的机制,如果当前ThreadPoolExecutor中的线程数量小于这个corePoolSize,就会创建一个新线程执行新提交的任务,哪怕ThreadPoolExecutor中其他的线程啥都没干。
maximumPoolSize:  这个也跟ThreadPoolExecutor中活跃的线程数量有关。
    (1)如果ThreadPoolExecutor中线程的数量已经达到或大于corePoolSize了,而且workQueue已经满了,那就新创建一个线程;
    (2)如果workQueue没有满,就只是把新提交的任务添加到workQueue里面等待执行;
    (3)如果workQueue满了,线程数量也达到maximumPoolSize,再提交任务,默认就会抛出RejectedExecutionException异常;
    (4)maximumPoolSize必须大于或等于corePoolSize。
keepAliveTime:  指定pool中数量超过corePoolSize的线程,能空闲多长时间。超过这个时间了,线程就会被终止。
    (1)这个参数必须大于或等于0。
    (2)如果allowCoreThreadTimeOut为true,则keepAliveTime必须大于0,核心线程空闲时间超过keepAliveTime,也会被终止;否则核心线程会一直存活着。
    (3)unit指定了keepAliveTime的单位。
workQueue:  任务队列。参加maximumPoolSize感受一下这个参数与创建新线程的关系。
其他的参数暂且不说。

说明:
(1) corePoolSize和maximumPoolSize参数,指定了ThreadPoolExecutor中活跃线程的下限和上限;
(2)keepAliveTime太小,空闲线程的存活时间比较短,需要考虑线程反复创建的代价;
(3)workQueue如果是无界的,就要考虑提交的任务不能太多。否则都塞到这个队列里面不处理,就会内存溢出啥的;
(4)创建线程池,方便起见,可以用Executors.newXXX来创建。但要注意,这些方法创建的ThreadExecutor,workQueue都是无界的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章