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