springboot如何添加task任务执行队列

 更新时间:2023年07月21日 14:58:57   作者:huayang183  
这篇文章主要介绍了springboot如何添加task任务执行队列问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

springboot添加task任务执行队列

主要分为三块: 任务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();
    }
}

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

springboot添加task异步任务队列

public interface Itask {
    void run();
}
public class MyTask implements Itask {
    public MyTask () {
    }
	//要执行的代码逻辑
    @Override
    public void run() {
        System.out.println("MyTask");
    }
}
public class TaskExecutor extends Thread {
    private BlockingQueue taskQueue;
    private Boolean isRunning = true;
    public TaskExecutor(BlockingQueue taskQueue) {
        this.taskQueue = taskQueue;
    }
    // 退出。
    public void quit() {
        isRunning = false;
        interrupt();
    }
    @Override
    public void run() {
        while (isRunning) { // 如果是执行状态就待着。
            Itask iTask;
            try {
                iTask = (Itask) taskQueue.take(); // 下一个任务,没有就等着。
            } catch (InterruptedException e) {
                if (!isRunning) {
                    // 发生错误中断代码
                    interrupt();
                    break; 
                }
                // 发生意外了,不是退出状态,那么窗口继续等待。
                continue;
            }
            // 执行任务
            iTask.run();
        }
    }
}
public class TaskQueue {
    // 任务队列
    private BlockingQueue mTaskQueue;
    // 执行器
    private TaskExecutor[] mTaskExecutors;
    // 创建队列时,指定执行器数量,保证你开的多个线程是否需要等待
    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  int add(Itask task) {
        if (!mTaskQueue.contains(task)) {
            mTaskQueue.add(task);
        }
        // 返回队列中的任务数
        return mTaskQueue.size();
    }
}
public class Test{
	public static void main(String[] args) {
        TaskQueue tq = new TaskQueue(1);
        MyTask myTask= new MyTask ();
        tq.add(myTask);
        tq.start();
    }
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • SpringBoot Security密码加盐实例

    SpringBoot Security密码加盐实例

    这篇文章主要为打击介绍了SpringBoot Security密码加盐实例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • springboot的实体类字段校验的分组校验具体实现步骤

    springboot的实体类字段校验的分组校验具体实现步骤

    分组校验允许在不同场景下对同一实体类应用不同的校验规则,通过定义分组接口、在实体类和Controller中指定分组,以及全局异常处理,可以灵活控制校验规则,本文介绍springboot的实体类字段校验的分组校验,感兴趣的朋友一起看看吧
    2025-03-03
  • spring cloud实现前端跨域问题的解决方案

    spring cloud实现前端跨域问题的解决方案

    这篇文章主要介绍了 spring cloud实现前端跨域问题的解决方案,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-01-01
  • SpringBoot中AOP的多种用途与实践指南

    SpringBoot中AOP的多种用途与实践指南

    Spring Boot结合AOP提供了强大的功能,可以用于日志记录、性能监控、异常处理、权限校验等多种场景,通过AOP,我们可以将横切关注点从业务逻辑中分离出来,从而提高代码的可维护性和可读性,下面就来一起了解一下
    2026-03-03
  • SpringBoot使用前缀树实现敏感词过滤示例

    SpringBoot使用前缀树实现敏感词过滤示例

    最近项目用到了敏感词过滤,本文主要就来介绍一下SpringBoot使用前缀树实现敏感词过滤示例,具有一定的参考价值,感兴趣的可以了解一下
    2023-10-10
  • mybatis+lombok出现java.lang.IndexOutOfBoundsException错误及解决

    mybatis+lombok出现java.lang.IndexOutOfBoundsException错误及解决

    在使用MyBatis和Lombok时,如果遇到java.lang.IndexOutOfBoundsException问题,是因为MyBatis在尝试将查询结果封装成Java对象时,找不到构造函数中对应的字段,这通常是由于Lombok的@Builder注解生成了全参构造函数
    2025-02-02
  • java 类加载机制和反射详解及实例代码

    java 类加载机制和反射详解及实例代码

    这篇文章主要介绍了java 类加载机制和反射详解及实例代码的相关资料,需要的朋友可以参考下
    2017-03-03
  • Java中保证线程顺序执行的四种实现方式

    Java中保证线程顺序执行的四种实现方式

    在多线程编程中,线程的并发执行通常是不可预知的,然而在某些应用场景中,我们需要确保多个线程按特定的顺序执行,本文将介绍几种常见的方式,帮助我们在多线程中保证执行顺序,需要的朋友可以参考下
    2025-08-08
  • Java数据类型Integer与int的区别详细解析

    Java数据类型Integer与int的区别详细解析

    这篇文章主要介绍了Java数据类型Integer与int的区别详细解析,Ingeter是int的包装类,int的初值为0,Ingeter的初值为null,int和integer(无论new否)比,都为true,因为会把Integer自动拆箱为int再去比,需要的朋友可以参考下
    2023-12-12
  • 实例讲解分布式缓存软件Memcached的Java客户端使用

    实例讲解分布式缓存软件Memcached的Java客户端使用

    这篇文章主要介绍了分布式缓存软件Memcached的Java客户端使用,Memcached在GitHub上开源,作者用其Windows平台下的版本进行演示,需要的朋友可以参考下
    2016-01-01

最新评论