springboot添加task任务执行队列

本文介绍了如何在SpringBoot中使用TaskExecutor任务执行器和TaskQueue任务队列来创建和管理异步任务。通过定义ITask接口及其实现类,结合任务执行器和队列,实现了一个高效的任务处理解决方案,特别适合处理需要返回值的异步任务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

主要分为三块: 任务task,TaskExecutor任务执行器,TaskQueue任务队列。

下面详细讲解一下:

任务task的接口ITask:

public interface ITask {
   //执行方法
    void run();
}

任务task的接口实现类:

public class ActionAppTask implements ITask {

    public ActionAppTask(){
      //构造方法
    }

    @Override
    public void run() {
      //todo:要执行的操作
    }

}

TaskExecutor任务执行器:

public class TaskExecutor extends Thread {

    // 任务队列,里面是要执行的任务。
    private BlockingQueue<ITask> taskQueue;

    // 任务队列是否在执行任务
    private boolean isRunning = true;

    public TaskExecutor(BlockingQueue<ITask> taskQueue) {
        this.taskQueue = taskQueue;
    }

    // 退出。
    public void quit() {
        isRunning = false;
        interrupt();
    }

    @Override
    public void run() {
        while (isRunning) { // 如果是执行状态就待着。
            ITask iTask;
            try {
                iTask = taskQueue.take(); // 下一个任务,没有就等着。
            } catch (InterruptedException e) {
                if (!isRunning) {
                    // 发生意外了,是退出状态的话就把窗口关闭。
                    interrupt();
                    break; // 如果执行到break,后面的代码就无效了。
                }
                // 发生意外了,不是退出状态,那么窗口继续等待。
                continue;
            }

            // 执行任务。
            iTask.run();
        }
    }

}

TaskQueue任务队列:

public class TaskQueue {

    // 队列,里面是任务。
    private BlockingQueue<ITask> mTaskQueue;
    // 好多执行器。
    private TaskExecutor[] mTaskExecutors;

    // new队列的时候,要指定执行器数量。这可以确定你开的多个线程是否需要等待。
    public TaskQueue(int size) {
        mTaskQueue = new LinkedBlockingQueue<>();
        mTaskExecutors = new TaskExecutor[size];
    }

    // 开启队列。
    public void start() {
        stop();
        // 开启队列。
        for (int i = 0; i < mTaskExecutors.length; i++) {
            mTaskExecutors[i] = new TaskExecutor(mTaskQueue);
            mTaskExecutors[i].start();
        }
    }

    // 关闭队列。
    public void stop() {
        if (mTaskExecutors != null)
            for (TaskExecutor taskExecutor : mTaskExecutors) {
                if (taskExecutor != null) taskExecutor.quit();
            }
    }

    //添加任务到队列。
    public <T extends ITask> int add(T task) {
        if (!mTaskQueue.contains(task)) {
            mTaskQueue.add(task);
        }
        // 返回队列中的任务数
        return mTaskQueue.size();
    }

}

亲测非常好用,对于有线程返回值的异步任务处理,非常适合。

 

### Spring Boot 线程池配置与使用 #### 配置线程池 在Spring Boot中,`ThreadPoolTaskExecutor`被提供作为默认的线程池实现[^1]。为了满足不同的业务场景需求,可以通过自定义的方式对其进行配置: ```yaml spring: task: execution: pool: core-size: 5 # 核心线程数 max-size: 10 # 最大线程数 queue-capacity: 100 # 队列容量 keep-alive: 60s # 当多余线程闲置时间超过此设定值时将会终止 ``` 上述YAML文件中的设置可以调整线程池的核心参数,从而优化应用程序性能。 对于更复杂的定制化需求,则可以在Java代码内部通过重写`concurrent`包下的`ThreadPoolTaskExecutor`来进行更为细致化的控制。 #### 使用 @Async 注解 为了让方法能够异步执行,在启动类上添加`@EnableAsync`注释以开启异步支持功能[^2]。之后便可在任何服务层的方法前加上`@Async`标签使其变为非阻塞调用方式运行于后台线程之中。 ```java @Service public class AsyncService { @Async public void executeAsyncMethod() { System.out.println("Executing asynchronously"); } } ``` 这段简单的例子展示了如何标记一个普通的成员函数成为异步操作的一部分。 #### 创建并推送任务队列 当涉及到具体的任务调度逻辑时,比如记录用户登录次数这样的场景下,可借助类似于下面给出的任务管理器接口来完成相应的工作流程设计[^4]: ```java // 定义任务参数对象 TaskParam taskParam = new TaskParam(LoginSuccessListener.class); taskParam.put("last_login_time", new Date()); // 将构建好的任务推送到指定的消息队列里等待被执行 taskManager.pushTask(taskParam); ``` 这里展示了一个具体的应用实例——每当有新的登陆事件发生时就触发一次更新动作,并把相关信息打包成待办事项交给专门负责处理此类请求的服务端组件去进一步处置。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值