springboot如何添加task任務(wù)執(zhí)行隊(duì)列
springboot添加task任務(wù)執(zhí)行隊(duì)列
主要分為三塊: 任務(wù)task,TaskExecutor任務(wù)執(zhí)行器,TaskQueue任務(wù)隊(duì)列。
下面詳細(xì)講解一下:
任務(wù)task的接口ITask
public interface ITask {
? ?//執(zhí)行方法
? ? void run();
}任務(wù)task的接口實(shí)現(xiàn)類(lèi)
public class ActionAppTask implements ITask {
? ? public ActionAppTask(){
? ? ? //構(gòu)造方法
? ? }
? ? @Override
? ? public void run() {
? ? ? //todo:要執(zhí)行的操作
? ? }
}TaskExecutor任務(wù)執(zhí)行器
public class TaskExecutor extends Thread {
? ? // 任務(wù)隊(duì)列,里面是要執(zhí)行的任務(wù)。
? ? private BlockingQueue<ITask> taskQueue;
? ? // 任務(wù)隊(duì)列是否在執(zhí)行任務(wù)
? ? 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(); // 下一個(gè)任務(wù),沒(méi)有就等著。
? ? ? ? ? ? } catch (InterruptedException e) {
? ? ? ? ? ? ? ? if (!isRunning) {
? ? ? ? ? ? ? ? ? ? // 發(fā)生意外了,是退出狀態(tài)的話就把窗口關(guān)閉。
? ? ? ? ? ? ? ? ? ? interrupt();
? ? ? ? ? ? ? ? ? ? break; // 如果執(zhí)行到break,后面的代碼就無(wú)效了。
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? // 發(fā)生意外了,不是退出狀態(tài),那么窗口繼續(xù)等待。
? ? ? ? ? ? ? ? continue;
? ? ? ? ? ? }
? ? ? ? ? ? // 執(zhí)行任務(wù)。
? ? ? ? ? ? iTask.run();
? ? ? ? }
? ? }
}TaskQueue任務(wù)隊(duì)列
public class TaskQueue {
? ? // 隊(duì)列,里面是任務(wù)。
? ? private BlockingQueue<ITask> mTaskQueue;
? ? // 好多執(zhí)行器。
? ? private TaskExecutor[] mTaskExecutors;
? ? // new隊(duì)列的時(shí)候,要指定執(zhí)行器數(shù)量。這可以確定你開(kāi)的多個(gè)線程是否需要等待。
? ? public TaskQueue(int size) {
? ? ? ? mTaskQueue = new LinkedBlockingQueue<>();
? ? ? ? mTaskExecutors = new TaskExecutor[size];
? ? }
? ? // 開(kāi)啟隊(duì)列。
? ? public void start() {
? ? ? ? stop();
? ? ? ? // 開(kāi)啟隊(duì)列。
? ? ? ? for (int i = 0; i < mTaskExecutors.length; i++) {
? ? ? ? ? ? mTaskExecutors[i] = new TaskExecutor(mTaskQueue);
? ? ? ? ? ? mTaskExecutors[i].start();
? ? ? ? }
? ? }
? ? // 關(guān)閉隊(duì)列。
? ? public void stop() {
? ? ? ? if (mTaskExecutors != null)
? ? ? ? ? ? for (TaskExecutor taskExecutor : mTaskExecutors) {
? ? ? ? ? ? ? ? if (taskExecutor != null) taskExecutor.quit();
? ? ? ? ? ? }
? ? }
? ? //添加任務(wù)到隊(duì)列。
? ? public <T extends ITask> int add(T task) {
? ? ? ? if (!mTaskQueue.contains(task)) {
? ? ? ? ? ? mTaskQueue.add(task);
? ? ? ? }
? ? ? ? // 返回隊(duì)列中的任務(wù)數(shù)
? ? ? ? return mTaskQueue.size();
? ? }
}親測(cè)非常好用,對(duì)于有線程返回值的異步任務(wù)處理,非常適合。
springboot添加task異步任務(wù)隊(duì)列
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(); // 下一個(gè)任務(wù),沒(méi)有就等著。
} catch (InterruptedException e) {
if (!isRunning) {
// 發(fā)生錯(cuò)誤中斷代碼
interrupt();
break;
}
// 發(fā)生意外了,不是退出狀態(tài),那么窗口繼續(xù)等待。
continue;
}
// 執(zhí)行任務(wù)
iTask.run();
}
}
}public class TaskQueue {
// 任務(wù)隊(duì)列
private BlockingQueue mTaskQueue;
// 執(zhí)行器
private TaskExecutor[] mTaskExecutors;
// 創(chuàng)建隊(duì)列時(shí),指定執(zhí)行器數(shù)量,保證你開(kāi)的多個(gè)線程是否需要等待
public TaskQueue(int size) {
mTaskQueue = new LinkedBlockingQueue<>();
mTaskExecutors = new TaskExecutor[size];
}
// 開(kāi)啟隊(duì)列。
public void start() {
stop();
for (int i = 0; i < mTaskExecutors.length; i++) {
mTaskExecutors[i] = new TaskExecutor(mTaskQueue);
mTaskExecutors[i].start();
}
}
// 關(guān)閉隊(duì)列。
public void stop() {
if (mTaskExecutors != null)
for (TaskExecutor taskExecutor : mTaskExecutors) {
if (taskExecutor != null) taskExecutor.quit();
}
}
//添加任務(wù)到隊(duì)列。
public int add(Itask task) {
if (!mTaskQueue.contains(task)) {
mTaskQueue.add(task);
}
// 返回隊(duì)列中的任務(wù)數(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();
}
}總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot Security密碼加鹽實(shí)例
這篇文章主要為打擊介紹了SpringBoot Security密碼加鹽實(shí)例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02
springboot的實(shí)體類(lèi)字段校驗(yàn)的分組校驗(yàn)具體實(shí)現(xiàn)步驟
分組校驗(yàn)允許在不同場(chǎng)景下對(duì)同一實(shí)體類(lèi)應(yīng)用不同的校驗(yàn)規(guī)則,通過(guò)定義分組接口、在實(shí)體類(lèi)和Controller中指定分組,以及全局異常處理,可以靈活控制校驗(yàn)規(guī)則,本文介紹springboot的實(shí)體類(lèi)字段校驗(yàn)的分組校驗(yàn),感興趣的朋友一起看看吧2025-03-03
spring cloud實(shí)現(xiàn)前端跨域問(wèn)題的解決方案
這篇文章主要介紹了 spring cloud實(shí)現(xiàn)前端跨域問(wèn)題的解決方案,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-01-01
SpringBoot使用前綴樹(shù)實(shí)現(xiàn)敏感詞過(guò)濾示例
最近項(xiàng)目用到了敏感詞過(guò)濾,本文主要就來(lái)介紹一下SpringBoot使用前綴樹(shù)實(shí)現(xiàn)敏感詞過(guò)濾示例,具有一定的參考價(jià)值,感興趣的可以了解一下2023-10-10
mybatis+lombok出現(xiàn)java.lang.IndexOutOfBoundsException錯(cuò)誤及解決
在使用MyBatis和Lombok時(shí),如果遇到j(luò)ava.lang.IndexOutOfBoundsException問(wèn)題,是因?yàn)镸yBatis在嘗試將查詢(xún)結(jié)果封裝成Java對(duì)象時(shí),找不到構(gòu)造函數(shù)中對(duì)應(yīng)的字段,這通常是由于Lombok的@Builder注解生成了全參構(gòu)造函數(shù)2025-02-02
java 類(lèi)加載機(jī)制和反射詳解及實(shí)例代碼
這篇文章主要介紹了java 類(lèi)加載機(jī)制和反射詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-03-03
Java中保證線程順序執(zhí)行的四種實(shí)現(xiàn)方式
在多線程編程中,線程的并發(fā)執(zhí)行通常是不可預(yù)知的,然而在某些應(yīng)用場(chǎng)景中,我們需要確保多個(gè)線程按特定的順序執(zhí)行,本文將介紹幾種常見(jiàn)的方式,幫助我們?cè)诙嗑€程中保證執(zhí)行順序,需要的朋友可以參考下2025-08-08
Java數(shù)據(jù)類(lèi)型Integer與int的區(qū)別詳細(xì)解析
這篇文章主要介紹了Java數(shù)據(jù)類(lèi)型Integer與int的區(qū)別詳細(xì)解析,Ingeter是int的包裝類(lèi),int的初值為0,Ingeter的初值為null,int和integer(無(wú)論new否)比,都為true,因?yàn)闀?huì)把Integer自動(dòng)拆箱為int再去比,需要的朋友可以參考下2023-12-12
實(shí)例講解分布式緩存軟件Memcached的Java客戶(hù)端使用
這篇文章主要介紹了分布式緩存軟件Memcached的Java客戶(hù)端使用,Memcached在GitHub上開(kāi)源,作者用其Windows平臺(tái)下的版本進(jìn)行演示,需要的朋友可以參考下2016-01-01

