[并发编程] - Executor框架#ThreadPoolExecutor源码解读02

简介: [并发编程] - Executor框架#ThreadPoolExecutor源码解读02

20200902001421975.png

Pre

Java-Java中的线程池原理分析及使用

[并发编程] - Executor框架#ThreadPoolExecutor源码解读01


线程池的具体实现


20200902023957639.png


主要两大类

  1. ThreadPoolExecutor
  2. ScheduledThreadPoolExecutor

今天我们主要来看 ThreadPoolExecutor


线程池的创建


20200902024123558.png


构造函数如上

找个参数最多的讲解下

 public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue,
                              ThreadFactory threadFactory,
                              RejectedExecutionHandler handler) {....}


参数解读


corePoolSize


线程池中的核心线程数,当提交一个任务时,线程池创建一个新线程执行任务,直到当前线程数等于corePoolSize;


举个例子,假设corePoolSize=5 , 第一个任务过来以后,会创建一个核心线程,第一个任务执行结束了,现在池子里有1个线程。 这时候第二个任务来的时候,不会用原来的这个空闲的线程,线程池还是会继续创建核心线程。


如果当前线程数为corePoolSize,继续提交的任务被保存到阻塞队列中,等待被执行

如果执行了线程池的prestartAllCoreThreads()方法,线程池会提前创建并启动所有核心线程。


maximumPoolSize


线程池中允许的最大线程数。如果当前阻塞队列满了,且继续提交任务,则创建新的线程执行任务,前提是当前线程数小于maximumPoolSize;

maximumPoolSize = 核心线程数 + 非核心线程数


keepAliveTime


线程池维护线程所允许的空闲时间。当线程池中的线程数量大于corePoolSize的时候,如果这时没有新的任务提交,核心线程外的线程不会立即销毁,而是会等待,直到等待的时间超过了keepAliveTime;


unit

keepAliveTime的单位;


workQueue

用来保存等待被执行的任务的阻塞队列,且任务必须实现Runable接口。

在JDK中提供了如下阻塞队列:


ArrayBlockingQueue:基于数组结构的有界阻塞队列,按FIFO排序任务;

LinkedBlockingQuene:基于链表结构的阻塞队列,按FIFO排序任务,吞

吐量通常要高于ArrayBlockingQuene;

SynchronousQuene:一个不存储元素的阻塞队列,每个插入操作必须等到

另一个线程调用移除操作,否则插入操作一直处于阻塞状态,吞吐量通常要高于LinkedBlockingQuene;

priorityBlockingQuene:具有优先级的无界阻塞队列;


threadFactory


它是ThreadFactory类型的变量,用来创建新线程。默认使用Executors.defaultThreadFactory() 来创建线程。

使用默认的ThreadFactory来创建线程时,会使新创建的线程具有相同的NORM_PRIORITY优先级并且是非守护线程,同时也设置了线程的名称。


handler

线程池的饱和策略,当阻塞队列满了,且没有空闲的工作线程,如果继续提交任务,必须采取一种策略处理该任务,线程池提供了4种策略:

  1. AbortPolicy:直接抛出异常,默认策略;
  2. CallerRunsPolicy:用调用者所在的线程来执行任务;
  3. DiscardOldestPolicy:丢弃阻塞队列中靠最前的任务,并执行当前任务;
  1. DiscardPolicy:直接丢弃任务;

上面的4种策略都是ThreadPoolExecutor的内部类.

当然也可以根据应用场景实现RejectedExecutionHandler接口,自定义饱和策略,如记录日志或持久化存储不能处理的任务.


任务提交


方式一 提交任务无返回值

public void execute() //提交任务无返回值


方式二 提交任务有返回值

public Future<?> submit() //任务执行完成后有返回值


线程池监控

public long getTaskCount() //线程池已执行与未执行的任务总数
public long getCompletedTaskCount() //已完成的任务数
public int getPoolSize() //线程池当前的线程数
public int getActiveCount() //线程池中正在执行任务的线程数量(大致数量,不一定准确)


相关文章
|
Dragonfly 监控 Unix
Go整合gopsutils监控系统性能指标参数
Go整合gopsutils监控系统性能指标参数
|
Java 测试技术
slf4j的log.warn()的参数问题研究
slf4j的log.warn()的参数问题研究
455 0
|
4天前
|
人工智能 运维 安全
|
2天前
|
人工智能 异构计算
敬请锁定《C位面对面》,洞察通用计算如何在AI时代持续赋能企业创新,助力业务发展!
敬请锁定《C位面对面》,洞察通用计算如何在AI时代持续赋能企业创新,助力业务发展!
|
10天前
|
人工智能 JavaScript 测试技术
Qwen3-Coder入门教程|10分钟搞定安装配置
Qwen3-Coder 挑战赛简介:无论你是编程小白还是办公达人,都能通过本教程快速上手 Qwen-Code CLI,利用 AI 轻松实现代码编写、文档处理等任务。内容涵盖 API 配置、CLI 安装及多种实用案例,助你提升效率,体验智能编码的乐趣。
833 109
|
4天前
|
机器学习/深度学习 人工智能 自然语言处理
B站开源IndexTTS2,用极致表现力颠覆听觉体验
在语音合成技术不断演进的背景下,早期版本的IndexTTS虽然在多场景应用中展现出良好的表现,但在情感表达的细腻度与时长控制的精准性方面仍存在提升空间。为了解决这些问题,并进一步推动零样本语音合成在实际场景中的落地能力,B站语音团队对模型架构与训练策略进行了深度优化,推出了全新一代语音合成模型——IndexTTS2 。
435 11
|
3天前
|
人工智能 测试技术 API
智能体(AI Agent)搭建全攻略:从概念到实践的终极指南
在人工智能浪潮中,智能体(AI Agent)正成为变革性技术。它们具备自主决策、环境感知、任务执行等能力,广泛应用于日常任务与商业流程。本文详解智能体概念、架构及七步搭建指南,助你打造专属智能体,迎接智能自动化新时代。