关于线程池ThreadPoolExecutor

线程池的目的:

当并发请求数量较多,而每个线程的执行时间比较短,这样就会频繁的创建和销毁线程,加大的开销,降低了系统的效率。而线程池的出现,可以使一个任务在使用完毕后不销毁线程,还可以在其他任务来到时,不用创建,去使用已有的线程。线程池解决了线程的生命周期的开销和资源不足的问题。

当单个任务处理时间较短。或是任务量很大的时候我们可以去使用线程池


线程池的好处:

  • 降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。

  • 提高响应速度。当任务到达时,任务可以不需要的等到线程创建就能立即执行。

  • 提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。

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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容