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();
    }
}

总结

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

相关文章

  • Java之单链表问题解决案例讲解

    Java之单链表问题解决案例讲解

    这篇文章主要介绍了Java之单链表问题解决案例讲解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • Tomcat调优详解

    Tomcat调优详解

    这篇文章主要介绍了Tomcat调优方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04
  • dubbo filter中有关bean注入和配置文件读取方式

    dubbo filter中有关bean注入和配置文件读取方式

    这篇文章主要介绍了dubbo filter中有关bean注入和配置文件读取方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • Spring createBeanInstance实例化Bean

    Spring createBeanInstance实例化Bean

    这篇文章主要为大家介绍了Spring createBeanInstance实例化Bean源码解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • Spring中的NamespaceHandler加载过程源码详解

    Spring中的NamespaceHandler加载过程源码详解

    这篇文章主要介绍了Spring中的NamespaceHandler加载过程源码详解,Spring提供的NamespaceHandler的处理机制,简单来说就是命名空间处理器,Spring为了开放性提供了NamespaceHandler机制,这样我们就可以根据需求自己来处理我们设置的标签元素,需要的朋友可以参考下
    2024-02-02
  • Java Validation Api如何实现自定义注解

    Java Validation Api如何实现自定义注解

    这篇文章主要介绍了Java Validation Api如何实现自定义注解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • 一篇文章带你入门Java基本概念

    一篇文章带你入门Java基本概念

    本文主要介绍了Java编程的基本概念基本概念,可以帮助我们更加深刻的所要讲解的Java命令,具有很好的参考价值。下面跟着小编一起来看下吧,希望能给你带来帮助
    2021-08-08
  • 使用Java对Hbase操作总结及示例代码

    使用Java对Hbase操作总结及示例代码

    这篇文章主要介绍了使用Java对Hbase进行操作总结,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • springboot aop添加日志方式

    springboot aop添加日志方式

    这篇文章主要介绍了springboot aop添加日志方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • Mybatis 插入一条或批量插入 返回带有自增长主键记录的实例

    Mybatis 插入一条或批量插入 返回带有自增长主键记录的实例

    下面小编就为大家分享一篇Mybatis 插入一条或批量插入 返回带有自增长主键记录的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12

最新评论