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 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 = taskQueue.take(); // 下一个任务,没有就等着。
            } catch (InterruptedException e) {
                if (!isRunning) {
                    // 发生意外了,是退出状态的话就把窗口关闭。
                    interrupt();
                    break; // 如果执行到break,后面的代码就无效了。
                }
                // 发生意外了,不是退出状态,那么窗口继续等待。
                continue;
            }

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

}

TaskQueue任务队列:

public class TaskQueue {

    // 队列,里面是任务。
    private BlockingQueue 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  int add(T task) {
        if (!mTaskQueue.contains(task)) {
            mTaskQueue.add(task);
        }
        // 返回队列中的任务数
        return mTaskQueue.size();
    }

}

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

 

你可能感兴趣的:(异步任务队列)