Java线程池的增长过程

简介: Java线程池的增长过程通过ThreadPoolExecutor的方式创建线程池ThreadPoolExecutor 构造方法:复制代码public ThreadPoolExecutor(int corePoolSize, int maximu...

Java线程池的增长过程
通过ThreadPoolExecutor的方式创建线程池
ThreadPoolExecutor 构造方法:

复制代码
public ThreadPoolExecutor(int corePoolSize,

                          int maximumPoolSize,
                          long keepAliveTime,
                          TimeUnit unit,
                          BlockingQueue<Runnable> workQueue,
                          ThreadFactory threadFactory,
                          RejectedExecutionHandler handler) {
    //code...      

}
复制代码
参数的意义:

1.corePoolSize 指定了线程池里的线程数量,核心线程池大小
2.maximumPoolSize 指定了线程池里的最大线程数量
3.keepAliveTime 当线程池线程数量大于corePoolSize时候,多出来的空闲线程,多长时间会被销毁。
4.unit 时间单位
5.workQueue 任务队列,用于存放提交但是尚未被执行的任务。
6.threadFactory 线程工厂,用于创建线程,一般可以用默认的
7.handler 拒绝策略,当任务过多时候,如何拒绝任务。当提交任务数超过maximumPoolSize + workQueue 的size之和,任务交给RejectedExecutionHandler 处理

线程池的增长
线程池的增长与创建自定义线程池时设置的参数密切相关,重点讲解比较容易让人误解的 corePoolsize, maximumPoolsize, workQueue之 间关系。

先看一张图,理解一下增长过程

当线程池小于corePoolsize时,新提交的任务将创建一个新的线程执行任务,即使此时线程池中存在空闲线程。
当线程池达到corePoolSize时,新提交的任务将被放入workQueue中,等待线程池中任务调度执行
当workQueue已满,且线程池当提交任务数超过 maximumPoolSize 时,新提交任务由RejectedExecutionHandlier处理
另外需要特别注意的是,当线程池中超过corePoolSize线程,空闲时间达到keepAliveTime时,将会关闭空闲线程。
当设置allowCoreThreadTimeOut(true)时,线程池中corePoolSize线程空闲时间达到keepAliveTime也将关闭

当一个任务通过execute( Runnable)方法欲添加到线程池时:
如果此时线程池中的数量小于corePoolSize,即使线程池中的线程都处于空闲状态,也要创建新的线程来处理被添加的任务。
如果此时线程池中的数量等于corePoolSize,但是缓冲队列workQueue未满,那么任务被放入缓冲队列。
如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量小于maximumPoolSize,建新的线程来处理被添加的任务。
如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量等于maximumPoolSize,那么通过handler所指定的策略来处理此任务。也就是:处理任务的优先级为:核心线程corePoolSize、 任务队列workQueue、 最大线程maximumPoolSize,
如果三者都满了,使用RejectedExecutionHandlier处理被拒绝的任务。(具体怎么处理,属于拒绝策略的范畴)
当线程池中的线程数量大于corePoolSize时,如果某线程空闲时间超过keepAliveTime,线程将被终止。这样,线程池可以动态的调整池中的线程数。
说的再好,不如行动。不怕慢,就怕站。
原文地址https://www.cnblogs.com/ibigboy/p/11298010.html

相关文章
|
10天前
|
Java
Java并发编程:深入理解线程池
【4月更文挑战第30天】本文将深入探讨Java并发编程中的一个重要主题——线程池。我们将从线程池的基本概念入手,了解其工作原理和优势,然后详细介绍如何使用Java的Executor框架创建和管理线程池。最后,我们将讨论一些高级主题,如自定义线程工厂和拒绝策略。通过本文的学习,你将能够更好地理解和使用Java的线程池,提高你的并发编程能力。
|
13天前
|
Java 程序员 数据库
Java线程池让使用线程变得更加高效
使用一个线程需要经过创建、运行、销毁三大步骤,如果业务系统每个线程都要经历这个过程,那会带来过多不必要的资源消耗。线程池就是为了解决这个问题而生,需要时就从池中拿取,使用完毕就放回去,池化思想通过复用对象大大提高了系统的性能。线程池、数据库连接池、对象池等都采用了池化技术,下面我们就来学习下线程池的核心知识、面试重点~
54 5
Java线程池让使用线程变得更加高效
|
1天前
|
Java 数据库
【Java多线程】对线程池的理解并模拟实现线程池
【Java多线程】对线程池的理解并模拟实现线程池
9 1
|
3天前
|
缓存 Java
Java并发编程:深入理解线程池
【5月更文挑战第7天】本文将深入探讨Java并发编程中的重要概念——线程池。我们将了解线程池的基本概念,以及如何使用Java的Executor框架来创建和管理线程池。此外,我们还将讨论线程池的优点和缺点,以及如何选择合适的线程池大小。最后,我们将通过一个示例来演示如何使用线程池来提高程序的性能。
|
10天前
|
缓存 Java 调度
Java并发编程:深入理解线程池
【4月更文挑战第30天】 在Java并发编程中,线程池是一种重要的工具,它可以帮助我们有效地管理线程,提高系统性能。本文将深入探讨Java线程池的工作原理,如何使用它,以及如何根据实际需求选择合适的线程池策略。
|
10天前
|
Java
Java并发编程:深入理解线程池
【4月更文挑战第30天】 本文将深入探讨Java中的线程池,解析其原理、使用场景以及如何合理地利用线程池提高程序性能。我们将从线程池的基本概念出发,介绍其内部工作机制,然后通过实例演示如何创建和使用线程池。最后,我们将讨论线程池的优缺点以及在实际应用中需要注意的问题。
|
11天前
|
Java
Java并发编程:深入理解线程池
【4月更文挑战第29天】在Java中,线程池是一种管理线程的强大工具,它可以提高系统性能,减少资源消耗。本文将深入探讨Java线程池的工作原理,如何使用它,以及在使用线程池时需要注意的问题。
|
11天前
|
Java
Java并发编程:深入理解线程池
【4月更文挑战第29天】 在Java并发编程中,线程池是一种重要的工具,它可以帮助我们管理线程资源,提高系统性能。本文将深入探讨线程池的工作原理、使用方法以及如何根据实际需求选择合适的线程池参数。通过阅读本文,你将能够更好地理解和使用Java线程池,提高你的并发编程能力。
|
11天前
|
Java 调度 开发者
Java并发编程:深入理解线程池
【4月更文挑战第29天】 在现代Java应用中,高效地管理线程资源是至关重要的。线程池作为一种优化手段,其设计旨在减少在执行大量异步任务时创建和销毁线程的开销,同时提供一种机制来控制并发执行的任务数量。本文将深入探讨线程池的核心概念、使用场景以及它们如何影响系统性能。我们将剖析不同类型的线程池实现,并讨论如何根据具体需求选择合适的配置策略,以期帮助开发者避免常见的并发陷阱,提升应用的性能和稳定性。
|
11天前
|
Java
Java并发编程:深入理解线程池
【4月更文挑战第29天】在Java并发编程中,线程池是提高程序性能和资源利用率的重要工具。本文将深入探讨线程池的工作原理、使用场景以及如何合理地配置线程池参数。通过阅读本文,你将能够更好地理解线程池的作用,并在实际应用中更加灵活地使用线程池。