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

线程池,及7大参数,4大拒绝策略

1. 线程池的基本概念

线程池由以下几个主要组件构成:

  • 任务队列(Task Queue): 用于存储等待执行的任务。
  • 工作线程池: 用于执行任务的线程集合。
  • 线程工厂(Thread Factory): 用于创建新线程的工厂。
  • 拒绝策略(Rejected Execution Handler): 定义了当任务被拒绝时的处理策略。

2. 线程池的参数

2.1 核心线程数(Core Pool Size)

核心线程数是线程池中一直存活的线程数量,即使它们处于空闲状态也不会被销毁。

2.2 最大线程数(Maximum Pool Size)

最大线程数是线程池中允许的最大线程数量,包括活动和空闲线程。

2.3 线程空闲时间(Keep Alive Time)

线程空闲时间是非核心线程在空闲状态下被保留的时间,超过这个时间就会被销毁,直到线程数达到核心线程数为止。

2.4 时间单位(Time Unit)

时间单位用于指定线程空闲时间的单位,可以是秒、毫秒等。

2.5 任务队列(Blocking Queue)

任务队列用于存储等待执行的任务,可以是有界队列或无界队列。

2.6 线程工厂(Thread Factory)

线程工厂用于创建新的线程,可以自定义线程的名称、优先级等属性。

2.7 拒绝策略(Rejected Execution Handler)

拒绝策略定义了当任务无法被接受时的处理方式,例如抛出异常、丢弃任务等。

3. 拒绝策略

Java线程池提供了四种拒绝策略:

3.1 AbortPolicy

抛出RejectedExecutionException异常,默认策略。

ThreadPoolExecutor executor = new ThreadPoolExecutor(
    corePoolSize, 
    maximumPoolSize, 
    keepAliveTime, 
    timeUnit, 
    blockingQueue, 
    threadFactory, 
    new ThreadPoolExecutor.AbortPolicy()
);
3.2 CallerRunsPolicy

使用调用线程执行被拒绝的任务。

ThreadPoolExecutor executor = new ThreadPoolExecutor(
    corePoolSize, 
    maximumPoolSize, 
    keepAliveTime, 
    timeUnit, 
    blockingQueue, 
    threadFactory, 
    new ThreadPoolExecutor.CallerRunsPolicy()
);
3.3 DiscardOldestPolicy

丢弃队列中最老的任务,然后重新尝试执行任务(不推荐)。

ThreadPoolExecutor executor = new ThreadPoolExecutor(
    corePoolSize, 
    maximumPoolSize, 
    keepAliveTime, 
    timeUnit, 
    blockingQueue, 
    threadFactory, 
    new ThreadPoolExecutor.DiscardOldestPolicy()
);
3.4 DiscardPolicy

直接丢弃被拒绝的任务。

ThreadPoolExecutor executor = new ThreadPoolExecutor(
    corePoolSize, 
    maximumPoolSize, 
    keepAliveTime, 
    timeUnit, 
    blockingQueue, 
    threadFactory, 
    new ThreadPoolExecutor.DiscardPolicy()
);

4. 完整示例

import java.util.concurrent.*;

public class ThreadPoolExample {

    public static void main(String[] args) {
        int corePoolSize = 2;
        int maximumPoolSize = 5;
        long keepAliveTime = 1;
        TimeUnit timeUnit = TimeUnit.SECONDS;
        BlockingQueue<Runnable> blockingQueue = new LinkedBlockingQueue<>();
        ThreadFactory threadFactory = Executors.defaultThreadFactory();
        RejectedExecutionHandler rejectedExecutionHandler = new ThreadPoolExecutor.AbortPolicy();

        ThreadPoolExecutor executor = new ThreadPoolExecutor(
                corePoolSize,
                maximumPoolSize,
                keepAliveTime,
                timeUnit,
                blockingQueue,
                threadFactory,
                rejectedExecutionHandler
        );

        // 提交任务给线程池
        for (int i = 0; i < 10; i++) {
            final int taskIndex = i;
            executor.execute(() -> {
                System.out.println("Thread: " + Thread.currentThread().getName() + ", executing task " + taskIndex);
                try {
                    Thread.sleep(2000); // 模拟任务执行时间
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            });
        }

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

在这个例子中,我们创建了一个线程池,并提交了10个任务给线程池执行。可以根据实际需要调整线程池的参数和拒绝策略。


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

相关文章:

  • Flutter网络通信-封装Dio
  • Java爬虫(Jsoup)详解
  • 高翔【自动驾驶与机器人中的SLAM技术】学习笔记(十三)图优化SLAM的本质
  • 跨平台WPF框架Avalonia教程 十五
  • 【STM32】MPU6050简介
  • 结构化需求分析与设计
  • uniapp实现拨打电话跳转手机拨号界面 (ios和安卓通用)
  • Python网络爬虫环境的安装指南
  • 《opencv实用探索·十》opencv双边滤波的简单理解
  • 2023年甘肃省职业院校技能大赛(中职教师组)网络安全竞赛样题(一)
  • 【在英伟达nvidia的jetson-orin-nx上使用调试摄像头-同时开启多个摄像头-基础测试(2)】
  • 探索数据之美:深入学习Plotly库的强大可视化
  • pta模拟题(C语言7-26 整除光棍、7-27 稳赢、7-28 查验身份证、7-29 出生年、7-30 点赞)
  • 第2章 知识抽取:概述、方法
  • 【C++】const关键字的详解!!
  • 有权图的最短路径算法
  • 关于“你对SpringCloud的理解”
  • TrustZone之虚拟地址空间
  • Python sorted函数及用法以及如何用json模块存储数据
  • 【精选】SpringDI依赖注入及注解实现SpringIoC
  • 对抗生成网络-G与D的loss异常问题
  • CoreDNS实战(十)-kubernetes插件
  • 怎么让CMake不使用VS作为构建工具,而是使用gcc
  • VMware安装Debian12.2作为服务器(无桌面)
  • 微信小程序生成二维码并保存到本地方法
  • 【MySQL】基本安装配置