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(); } }
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。