首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >ThreadPoolExecutor线程池,通过自定义任务类和自定义拒绝策略,获取被拒绝任务的数据

ThreadPoolExecutor线程池,通过自定义任务类和自定义拒绝策略,获取被拒绝任务的数据

原创
作者头像
JQ实验室
发布2025-08-18 14:39:48
发布2025-08-18 14:39:48
3160
举报
文章被收录于专栏:都到8月了都到8月了

以下是具体的实现步骤和示例代码:


1. 封装任务数据

为了在拒绝策略中获取任务数据,可以使用自定义的任务类来封装任务逻辑和相关数据。例如:

代码语言:java
复制
public class CustomTask implements Runnable {
    private final int taskId; // 任务的 ID 或其他数据
    private final String taskData; // 任务的具体数据

    public CustomTask(int taskId, String taskData) {
        this.taskId = taskId;
        this.taskData = taskData;
    }

    @Override
    public void run() {
        // 模拟任务执行
        System.out.println("Executing task " + taskId + " with data: " + taskData);
        try {
            Thread.sleep(2000); // 模拟任务耗时
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
    }

    public int getTaskId() {
        return taskId;
    }

    public String getTaskData() {
        return taskData;
    }
}

在这个例子中,CustomTask 类封装了任务的 ID 和数据,并实现了 Runnable 接口。


2. 自定义拒绝策略

在自定义拒绝策略中,可以通过类型检查将 Runnable 转换为自定义的任务类(如 CustomTask),然后提取任务数据。

(1) 实现自定义拒绝策略
代码语言:java
复制
import java.util.concurrent.RejectedExecutionHandler;
import java.util.concurrent.ThreadPoolExecutor;

public class CustomRejectedExecutionHandler implements RejectedExecutionHandler {
    @Override
    public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
        if (r instanceof CustomTask) {
            CustomTask task = (CustomTask) r;
            // 获取任务数据
            int taskId = task.getTaskId();
            String taskData = task.getTaskData();

            // 处理被拒绝的任务
            System.err.println("Task rejected - ID: " + taskId + ", Data: " + taskData);

            // 可以在这里实现日志记录、重试逻辑等
        } else {
            System.err.println("Unknown task type rejected: " + r.toString());
        }
    }
}

在这个拒绝策略中:

  • 如果任务是 CustomTask 类型,则提取其 ID 和数据。
  • 如果任务不是 CustomTask 类型,则输出未知任务类型的提示。

3. 使用线程池并提交任务

将自定义任务提交到线程池,并配置自定义拒绝策略。

代码语言:java
复制
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

public class ThreadPoolExample {
    public static void main(String[] args) {
        // 创建线程池
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(2);
        executor.setMaxPoolSize(4);
        executor.setQueueCapacity(2);
        executor.setRejectedExecutionHandler(new CustomRejectedExecutionHandler());
        executor.initialize();

        // 提交任务
        for (int i = 0; i < 10; i++) {
            String taskData = "Data-" + i;
            CustomTask task = new CustomTask(i, taskData);
            executor.execute(task);
        }

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

4. 输出结果

运行上述代码后,输出可能如下:

代码语言:java
复制
Executing task 0 with data: Data-0
Executing task 1 with data: Data-1
Task rejected - ID: 6, Data: Data-6
Task rejected - ID: 7, Data: Data-7
Task rejected - ID: 8, Data: Data-8
Task rejected - ID: 9, Data: Data-9

从输出结果可以看到:

  • 前两个任务由核心线程直接执行。
  • 当线程池和队列都满时,后续任务被拒绝。
  • 在拒绝策略中,提取了被拒绝任务的 ID 和数据。

5. 扩展功能

如果需要对被拒绝的任务进行进一步处理,可以在拒绝策略中实现以下功能:

  1. 重试机制:executor.execute(task);
    • 将任务重新提交到线程池。
  2. 保存任务到数据库或文件
    • 将任务数据存储到持久化存储中,稍后重新处理。
  3. 记录日志
    • 使用日志框架(如 Logback 或 SLF4J)记录被拒绝任务的详细信息。
  4. 通知管理员
    • 发送告警邮件或消息通知,提醒管理员处理异常情况。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 封装任务数据
  • 2. 自定义拒绝策略
    • (1) 实现自定义拒绝策略
  • 3. 使用线程池并提交任务
  • 4. 输出结果
  • 5. 扩展功能
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档