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都是无界的。