当前位置: 首页 > article >正文

线程池概念

1. 线程池的七大参数

线程池的核心参数通过 ThreadPoolExecutor 类定义:

  1. corePoolSize(核心线程数)

    • 线程池中始终保持存活的线程数量。
    • 即使线程空闲,也不会被销毁。
  2. maximumPoolSize(最大线程数)

    • 线程池中允许的最大线程数量。
    • 当任务队列满时,线程池会创建新线程,直到达到最大线程数。
  3. keepAliveTime(线程空闲时间)

    • 当线程数超过核心线程数时,空闲线程的存活时间。
    • 超过该时间后,空闲线程会被销毁。
  4. unit(时间单位)

    • keepAliveTime 的时间单位(如秒、毫秒)。
  5. workQueue(任务队列)

    • 用于存放待执行任务的阻塞队列。
    • 常见队列类型:LinkedBlockingQueueArrayBlockingQueueSynchronousQueue
  6. threadFactory(线程工厂)

    • 用于创建新线程的工厂。
    • 可以自定义线程的名称、优先级等。
  7. handler(拒绝策略)

    • 当任务队列满且线程数达到最大线程数时,如何处理新任务。
    • 常见策略:
      • AbortPolicy:抛出异常(默认)。
      • CallerRunsPolicy:由提交任务的线程执行。
      • DiscardPolicy:直接丢弃任务。
      • DiscardOldestPolicy:丢弃队列中最旧的任务

线程池概念、工作原理及 Executor 框架详解

一、线程池概念

线程池(Thread Pool) 是一种管理多线程的机制,通过预先创建并维护一组可复用的线程,避免频繁创建和销毁线程的开销,从而提高系统性能和资源利用率。其核心优势包括:

  • 降低资源消耗:复用线程,减少线程创建/销毁的开销。
  • 提高响应速度:任务到达时可直接使用空闲线程执行。
  • 提高线程可控性:统一管理线程数量、任务队列和拒绝策略。

二、线程池工作原理

线程池的核心流程如下:

  1. 任务提交
    用户通过 execute()submit() 方法向线程池提交任务(RunnableCallable 对象)。

  2. 任务处理逻辑

    • 核心线程未满:直接创建新线程执行任务。
    • 核心线程已满,任务队列未满:将任务放入队列等待。
    • 队列已满,线程数未达最大值:创建非核心线程执行任务。
    • 队列和线程数均达上限:触发拒绝策略(如抛出异常、丢弃任务等)。
  3. 线程复用
    线程执行完任务后不会立即销毁,而是保持存活并继续从队列中获取新任务。

  4. 线程回收
    非核心线程在空闲超时后会被销毁,核心线程默认长期存活(可配置)。


以下是关于 LinkedBlockingQueueArrayBlockingQueueSynchronousQueue 的差异说明,以及 execute()submit() 方法的使用示例。


2. 阻塞队列的差异

队列类型数据结构容量特性适用场景
LinkedBlockingQueue链表可选有界/无界- 默认无界(Integer.MAX_VALUE)。
- 吞吐量较高,适合任务处理较慢的场景。
需要缓冲大量任务的场景(如批处理系统)。
ArrayBlockingQueue数组固定有界- 必须指定容量。
- 内存预分配,性能稳定。
- 队列满时触发拒绝策略或创建新线程。
需严格控制资源的高并发场景。
SynchronousQueue无存储容量为 0- 不存储元素,直接传递任务。
- 插入操作需等待移除操作,反之亦然。
高吞吐量且任务处理极快的场景。
示例场景
  • LinkedBlockingQueue
    适用于需要缓冲大量任务的场景(如异步日志处理)。

    ExecutorService executor = new ThreadPoolExecutor(
        2, 4, 60, TimeUnit.SECONDS, 
        new LinkedBlockingQueue<>(100)  // 有界队列(容量100)
    );
    
  • ArrayBlockingQueue
    适用于资源受限的高并发场景(如秒杀系统)。

    ExecutorService executor = new ThreadPoolExecutor(
        2, 4, 60, TimeUnit.SECONDS, 
        new ArrayBlockingQueue<>(10)    // 固定容量10
    );
    
  • SynchronousQueue
    适用于要求即时响应的场景(如实时消息推送)。

    ExecutorService executor = new ThreadPoolExecutor(
        2, 4, 60, TimeUnit.SECONDS, 
        new SynchronousQueue<>()        // 直接传递任务,无缓冲
    );
    

3. execute()submit() 的区别及示例

方法参数类型返回值异常处理适用场景
execute()Runnable异常需在任务内捕获或全局处理。简单任务,无需获取结果。
submit()Runnable/CallableFuture可通过 Future.get() 捕获异常。需要获取结果或管理任务生命周期的场景。
1. execute() 示例
ExecutorService executor = Executors.newFixedThreadPool(2);

// 提交 Runnable 任务
executor.execute(() -> {
    System.out.println("Task executed by: " + Thread.currentThread().getName());
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
});

// 关闭线程池
executor.shutdown();
2. submit() 示例
ExecutorService executor = Executors.newFixedThreadPool(2);

// 提交 Callable 任务并获取 Future
Future<Integer> future = executor.submit(() -> {
    System.out.println("Callable task executed by: " + Thread.currentThread().getName());
    return 42;  // 返回计算结果
});

try {
    // 获取任务结果(阻塞直到任务完成)
    Integer result = future.get();
    System.out.println("Result: " + result);
} catch (InterruptedException | ExecutionException e) {
    e.printStackTrace();
}

// 关闭线程池
executor.shutdown();


http://www.kler.cn/a/559911.html

相关文章:

  • JS高德地图实现降雨降雪效果
  • 网络安全之PHP魔术方法深度解析
  • Python爬虫(四)- Selenium 安装与使用教程
  • jupyterhub on k8s 配置用户名密码 简单版
  • 防漏电保护,塔能物联运维为城市照明安全“上锁”
  • Python Seaborn库使用指南:从入门到精通
  • 【每日八股】MySQL篇(二):事务
  • CSS滚动条原理与自定义样式指南,CSS滚动条样式失效,滚动条样式无效,-webkit-scrollbar无效,overflow不显示滚动条
  • 力扣-贪心-55 跳跃游戏
  • DeepSeek行业应用实践报告-智灵动力【112页PPT全】
  • 登录+注册的前后端以及sql
  • 【面试】Redis 常见面试题
  • Qt QTreeWidget 总结
  • 企业金融数字场景平台:架构设计、实践与未来趋势
  • Linux-Ansible模块完结
  • Linux 内核中关于 CPU 编号和拓扑管理
  • at32f103a+rtt+AT组件+esp01s 模块使用
  • 网络练级宝典-> TCP协议
  • 掌握SQLAlchemy:Python数据库集成的艺术
  • 【R语言】读取CSV数据时,显示[1] PK...<0 行> (或0-长度的row.names)