java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > springboot添加task任务执行队列

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

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

总结

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

您可能感兴趣的文章:
阅读全文