程序员scholar 程序员scholar
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • Web 标准

    • HTML
    • CSS
    • JavaScript
  • 前端框架

    • Vue2
    • Vue3
    • Vue3 + TS
    • 微信小程序
    • uni-app
  • 工具与库

    • jQuery
    • Ajax
    • Axios
    • Webpack
    • Vuex
    • WebSocket
    • 第三方登录
  • 后端与语言扩展

    • ES6
    • Typescript
    • node.js
  • Element-UI
  • Apache ECharts
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • Web 标准

    • HTML
    • CSS
    • JavaScript
  • 前端框架

    • Vue2
    • Vue3
    • Vue3 + TS
    • 微信小程序
    • uni-app
  • 工具与库

    • jQuery
    • Ajax
    • Axios
    • Webpack
    • Vuex
    • WebSocket
    • 第三方登录
  • 后端与语言扩展

    • ES6
    • Typescript
    • node.js
  • Element-UI
  • Apache ECharts
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
npm

(进入注册为作者充电)

  • 快速入门

  • 克隆

  • 类型转换

  • 日期时间

  • IO流相关

  • 工具类

  • 语言特性

  • JavaBean

  • 集合类

  • Map

  • Codec编码

  • 文本操作

  • 注解

  • 比较器

  • 异常

  • 数学

  • 线程和并发

    • 异步工具类 - `AsyncUtil`
    • 自定义线程池 - `ExecutorBuilder`
      • 1. 使用场景
      • 2. 主要概念与配置
        • 2.1 核心配置
        • 2.2 线程池的工作流程
        • 2.3 常见工作队列策略
      • 3. 主要方法与示例
        • 3.1 创建默认线程池
        • 示例:创建默认线程池
        • 3.2 创建单线程线程池
        • 示例:创建单线程线程池
        • 3.3 创建自定义线程池
        • 示例:创建自定义线程池
        • 3.4 创建特殊策略线程池
        • 示例:创建特殊策略线程池
      • 4. 实际应用场景
      • 5. 注意事项
    • 高并发测试工具 - `ConcurrencyTester`
  • 图片

  • 网络

  • 源码编译

  • 配置文件

  • 日志

  • 缓存

  • JSON

  • 加密解密

  • DFA查找

  • HTTP客户端

  • 定时任务

  • 扩展

  • 切面

  • 脚本

  • Office文档操作

  • 系统调用

  • 图形验证码

  • 网络Socket

  • JWT

  • Hutoll
  • 线程和并发
scholar
2024-08-20
目录

自定义线程池 - ExecutorBuilder

# 自定义线程池 - ExecutorBuilder

简介

在 JDK 中,Executors 提供了创建自定义线程池对象 ExecutorService 的方法,但对于灵活的线程管理策略,单独使用 Executors 无法满足需求。ExecutorBuilder 通过组合不同的配置项来实现更复杂的线程管理策略,适用于多样化的线程池需求。

# 1. 使用场景

  • 异步任务处理:在高并发场景下,需要通过自定义线程池来控制任务的执行数量和等待队列。
  • 微服务调用并发控制:微服务调用中,需要限定并发请求数量和任务的最大等待队列。
  • 大规模数据处理:在批量数据处理、任务分发等场景中,通过自定义线程池可以有效提升系统的处理能力。

# 2. 主要概念与配置

# 2.1 核心配置

  • corePoolSize:初始池大小,表示核心线程数,即在没有任务时线程池维持的最小线程数量。
  • maxPoolSize:最大池大小,表示允许同时执行的最大线程数。
  • workQueue:任务队列,用于存储未执行的任务。当所有核心线程都在忙碌时,新的任务会被放入此队列等待执行。
  • handler:异常处理器(RejectedExecutionHandler),当线程池和等待队列都已满且无法处理新任务时,触发异常策略。

# 2.2 线程池的工作流程

  1. 如果池中任务数 < corePoolSize,则立即创建新线程执行任务。
  2. 如果池中任务数 > corePoolSize,任务进入等待队列。
  3. 当队列已满且池中任务数 < maxPoolSize 时,创建新线程立即执行任务。
  4. 如果执行中的线程数 > maxPoolSize,则触发异常处理策略。

# 2.3 常见工作队列策略

  • SynchronousQueue:不保存任务,任务直接提交给线程。当运行线程小于 maxPoolSize 时会创建新线程,否则触发异常策略。
  • LinkedBlockingQueue:默认无界队列,当运行线程数超过 corePoolSize 时,任务放入此队列。设置队列大小后,队列满时创建新线程,否则触发异常策略。
  • ArrayBlockingQueue:有界队列,适合控制队列大小。当队列满时,创建新线程,若线程数超过 maxPoolSize,则触发异常策略。

# 3. 主要方法与示例

# 3.1 创建默认线程池

默认策略:

  • 初始线程数为 corePoolSize 指定的大小。
  • 没有最大线程数限制。
  • 使用 LinkedBlockingQueue,默认队列大小为 1024。
  • 当线程数大于 corePoolSize 时,任务进入队列,队列满后抛出异常。

# 示例:创建默认线程池

import cn.hutool.core.thread.ExecutorBuilder;

import java.util.concurrent.ExecutorService;

public class DefaultExecutorExample {
    public static void main(String[] args) {
        // 创建默认线程池
        ExecutorService executor = ExecutorBuilder.create().build();

        // 提交任务
        executor.execute(() -> System.out.println("任务执行中..."));

        // 关闭线程池
        executor.shutdown();
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

# 3.2 创建单线程线程池

配置策略:

  • 初始线程数为 1。
  • 最大线程数为 1。
  • 使用 LinkedBlockingQueue,默认队列大小为 1024。
  • 同时只允许一个线程工作,其他任务进入队列,等待队列满时抛出异常。

# 示例:创建单线程线程池

import cn.hutool.core.thread.ExecutorBuilder;

import java.util.concurrent.ExecutorService;

public class SingleThreadExecutorExample {
    public static void main(String[] args) {
        // 创建单线程线程池
        ExecutorService executor = ExecutorBuilder.create()
            .setCorePoolSize(1)
            .setMaxPoolSize(1)
            .setKeepAliveTime(0)
            .build();

        // 提交任务
        for (int i = 0; i < 5; i++) {
            int taskId = i;
            executor.execute(() -> System.out.println("执行任务: " + taskId));
        }

        // 关闭线程池
        executor.shutdown();
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

# 3.3 创建自定义线程池

配置策略:

  • 初始 5 个线程。
  • 最大 10 个线程。
  • 使用有界等待队列,最大等待数为 100。

# 示例:创建自定义线程池

import cn.hutool.core.thread.ExecutorBuilder;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.LinkedBlockingQueue;

public class CustomExecutorExample {
    public static void main(String[] args) {
        // 创建自定义线程池
        ExecutorService executor = ExecutorBuilder.create()
            .setCorePoolSize(5)
            .setMaxPoolSize(10)
            .setWorkQueue(new LinkedBlockingQueue<>(100))
            .build();

        // 提交任务
        for (int i = 0; i < 20; i++) {
            int taskId = i;
            executor.execute(() -> System.out.println("执行任务: " + taskId));
        }

        // 关闭线程池
        executor.shutdown();
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

# 3.4 创建特殊策略线程池

配置策略:

  • 初始 5 个线程。
  • 最大 10 个线程。
  • 使用 SynchronousQueue,任务直接提交给线程,当线程数小于 maxPoolSize 时创建新线程,否则触发异常策略。

# 示例:创建特殊策略线程池

import cn.hutool.core.thread.ExecutorBuilder;

import java.util.concurrent.ExecutorService;

public class SpecialStrategyExecutorExample {
    public static void main(String[] args) {
        // 创建特殊策略线程池
        ExecutorService executor = ExecutorBuilder.create()
            .setCorePoolSize(5)
            .setMaxPoolSize(10)
            .useSynchronousQueue()
            .build();

        // 提交任务
        for (int i = 0; i < 15; i++) {
            int taskId = i;
            executor.execute(() -> System.out.println("执行任务: " + taskId));
        }

        // 关闭线程池
        executor.shutdown();
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

# 4. 实际应用场景

  • 并发任务处理:在需要并行处理大量任务时,通过自定义线程池控制并发数量和任务队列。
  • 异步服务调用:在微服务架构中,通过自定义线程池优化异步服务调用的并发和等待队列。
  • 资源受限场景:在系统资源有限的场景下,通过合理配置线程池大小和队列策略来提高处理能力。

# 5. 注意事项

  • 在线程池中设置合适的 corePoolSize 和 maxPoolSize,避免因资源占用过多导致系统性能下降。
  • 使用有界队列时,需要考虑队列满后的处理策略,确保系统的健壮性。
  • 在配置 handler 时,可以根据业务需求选择合适的异常处理策略,如抛出异常、丢弃任务或重试。
编辑此页 (opens new window)
上次更新: 2024/12/28, 18:32:08
异步工具类 - `AsyncUtil`
高并发测试工具 - `ConcurrencyTester`

← 异步工具类 - `AsyncUtil` 高并发测试工具 - `ConcurrencyTester`→

Theme by Vdoing | Copyright © 2019-2025 程序员scholar
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式