线程池的目的:
当并发请求数量较多,而每个线程的执行时间比较短,这样就会频繁的创建和销毁线程,加大的开销,降低了系统的效率。而线程池的出现,可以使一个任务在使用完毕后不销毁线程,还可以在其他任务来到时,不用创建,去使用已有的线程。线程池解决了线程的生命周期的开销和资源不足的问题。
当单个任务处理时间较短。或是任务量很大的时候我们可以去使用线程池
线程池的好处:
降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
提高响应速度。当任务到达时,任务可以不需要的等到线程创建就能立即执行。
提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler) {
if (corePoolSize < 0 ||
maximumPoolSize <= 0 ||
maximumPoolSize < corePoolSize ||
keepAliveTime < 0)
throw new IllegalArgumentException();
if (workQueue == null || threadFactory == null || handler == null)
throw new NullPointerException();
this.corePoolSize = corePoolSize;
this.maximumPoolSize = maximumPoolSize;
this.workQueue = workQueue;
this.keepAliveTime = unit.toNanos(keepAliveTime);
this.threadFactory = threadFactory;
this.handler = handler;
}
corePoolSize:线程池维护线程的最少数量
maximumPoolSize:线程池维护线程的最大数量
对于每一个任务提交,判断的顺序为 corePoolSize --> workQueue --> maximumPoolSize。
当前线程数<corePoolSize 那么即时有空闲线程也要创建新的线程。
当前线程数 >核心线程数,阻塞队列为空,那么此时将任务放到队列中,等到其他任务完成以后再运行它们。有空余的线程将从队列中取。
当前线程数 >核心线程数, 阻塞队列满,但线程池中的数量小于最大线程数,建新的线程来处理添加的任务。
当前线程数 >核心线程数, 阻塞队列满,但线程池中的数量等于最大线程数,使用handler处理被拒绝的任务。
当线程池中的线程数量大于corePoolSize时,如果某线程空闲时间超过keepAliveTime,线程将被终止。这样,线程池可以动态的调整池中的线程数。

5401975-4493820fd31f3127.png