springboot如何添加task任務執(zhí)行隊列
更新時間:2023年07月21日 14:58:57 作者:huayang183
這篇文章主要介紹了springboot如何添加task任務執(zhí)行隊列問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
springboot添加task任務執(zhí)行隊列
主要分為三塊: 任務task,TaskExecutor任務執(zhí)行器,TaskQueue任務隊列。
下面詳細講解一下:
任務task的接口ITask
public interface ITask { ? ?//執(zhí)行方法 ? ? void run(); }
任務task的接口實現(xiàn)類
public class ActionAppTask implements ITask { ? ? public ActionAppTask(){ ? ? ? //構造方法 ? ? } ? ? @Override ? ? public void run() { ? ? ? //todo:要執(zhí)行的操作 ? ? } }
TaskExecutor任務執(zhí)行器
public class TaskExecutor extends Thread { ? ? // 任務隊列,里面是要執(zhí)行的任務。 ? ? private BlockingQueue<ITask> taskQueue; ? ? // 任務隊列是否在執(zhí)行任務 ? ? private boolean isRunning = true; ? ? public TaskExecutor(BlockingQueue<ITask> taskQueue) { ? ? ? ? this.taskQueue = taskQueue; ? ? } ? ? // 退出。 ? ? public void quit() { ? ? ? ? isRunning = false; ? ? ? ? interrupt(); ? ? } ? ? @Override ? ? public void run() { ? ? ? ? while (isRunning) { // 如果是執(zhí)行狀態(tài)就待著。 ? ? ? ? ? ? ITask iTask; ? ? ? ? ? ? try { ? ? ? ? ? ? ? ? iTask = taskQueue.take(); // 下一個任務,沒有就等著。 ? ? ? ? ? ? } catch (InterruptedException e) { ? ? ? ? ? ? ? ? if (!isRunning) { ? ? ? ? ? ? ? ? ? ? // 發(fā)生意外了,是退出狀態(tài)的話就把窗口關閉。 ? ? ? ? ? ? ? ? ? ? interrupt(); ? ? ? ? ? ? ? ? ? ? break; // 如果執(zhí)行到break,后面的代碼就無效了。 ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? // 發(fā)生意外了,不是退出狀態(tài),那么窗口繼續(xù)等待。 ? ? ? ? ? ? ? ? continue; ? ? ? ? ? ? } ? ? ? ? ? ? // 執(zhí)行任務。 ? ? ? ? ? ? iTask.run(); ? ? ? ? } ? ? } }
TaskQueue任務隊列
public class TaskQueue { ? ? // 隊列,里面是任務。 ? ? private BlockingQueue<ITask> mTaskQueue; ? ? // 好多執(zhí)行器。 ? ? private TaskExecutor[] mTaskExecutors; ? ? // new隊列的時候,要指定執(zhí)行器數(shù)量。這可以確定你開的多個線程是否需要等待。 ? ? 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); ? ? ? ? } ? ? ? ? // 返回隊列中的任務數(shù) ? ? ? ? return mTaskQueue.size(); ? ? } }
親測非常好用,對于有線程返回值的異步任務處理,非常適合。
springboot添加task異步任務隊列
public interface Itask { void run(); }
public class MyTask implements Itask { public MyTask () { } //要執(zhí)行的代碼邏輯 @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) { // 如果是執(zhí)行狀態(tài)就待著。 Itask iTask; try { iTask = (Itask) taskQueue.take(); // 下一個任務,沒有就等著。 } catch (InterruptedException e) { if (!isRunning) { // 發(fā)生錯誤中斷代碼 interrupt(); break; } // 發(fā)生意外了,不是退出狀態(tài),那么窗口繼續(xù)等待。 continue; } // 執(zhí)行任務 iTask.run(); } } }
public class TaskQueue { // 任務隊列 private BlockingQueue mTaskQueue; // 執(zhí)行器 private TaskExecutor[] mTaskExecutors; // 創(chuàng)建隊列時,指定執(zhí)行器數(shù)量,保證你開的多個線程是否需要等待 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); } // 返回隊列中的任務數(shù) 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(); } }
總結
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
dubbo?filter中有關bean注入和配置文件讀取方式
這篇文章主要介紹了dubbo?filter中有關bean注入和配置文件讀取方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-05-05Spring?createBeanInstance實例化Bean
這篇文章主要為大家介紹了Spring?createBeanInstance實例化Bean源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-03-03Spring中的NamespaceHandler加載過程源碼詳解
這篇文章主要介紹了Spring中的NamespaceHandler加載過程源碼詳解,Spring提供的NamespaceHandler的處理機制,簡單來說就是命名空間處理器,Spring為了開放性提供了NamespaceHandler機制,這樣我們就可以根據(jù)需求自己來處理我們設置的標簽元素,需要的朋友可以參考下2024-02-02Java Validation Api如何實現(xiàn)自定義注解
這篇文章主要介紹了Java Validation Api如何實現(xiàn)自定義注解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-09-09Mybatis 插入一條或批量插入 返回帶有自增長主鍵記錄的實例
下面小編就為大家分享一篇Mybatis 插入一條或批量插入 返回帶有自增長主鍵記錄的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2017-12-12