最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

springboot如何添加task任務(wù)執(zhí)行隊(duì)列

 更新時(shí)間:2023年07月21日 14:58:57   作者:huayang183  
這篇文章主要介紹了springboot如何添加task任務(wù)執(zhí)行隊(duì)列問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

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)類

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ù),沒有就等著。
? ? ? ? ? ? } catch (InterruptedException e) {
? ? ? ? ? ? ? ? if (!isRunning) {
? ? ? ? ? ? ? ? ? ? // 發(fā)生意外了,是退出狀態(tài)的話就把窗口關(guān)閉。
? ? ? ? ? ? ? ? ? ? interrupt();
? ? ? ? ? ? ? ? ? ? break; // 如果執(zhí)行到break,后面的代碼就無效了。
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? // 發(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ù)量。這可以確定你開的多個(gè)線程是否需要等待。
? ? public TaskQueue(int size) {
? ? ? ? mTaskQueue = new LinkedBlockingQueue<>();
? ? ? ? mTaskExecutors = new TaskExecutor[size];
? ? }
? ? // 開啟隊(duì)列。
? ? public void start() {
? ? ? ? stop();
? ? ? ? // 開啟隊(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ù),沒有就等著。
            } 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ù)量,保證你開的多個(gè)線程是否需要等待
    public TaskQueue(int size) {
        mTaskQueue = new LinkedBlockingQueue<>();
        mTaskExecutors = new TaskExecutor[size];
    }
    // 開啟隊(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í)例

    這篇文章主要為打擊介紹了SpringBoot Security密碼加鹽實(shí)例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • springboot的實(shí)體類字段校驗(yàn)的分組校驗(yàn)具體實(shí)現(xiàn)步驟

    springboot的實(shí)體類字段校驗(yàn)的分組校驗(yàn)具體實(shí)現(xiàn)步驟

    分組校驗(yàn)允許在不同場(chǎng)景下對(duì)同一實(shí)體類應(yīng)用不同的校驗(yàn)規(guī)則,通過定義分組接口、在實(shí)體類和Controller中指定分組,以及全局異常處理,可以靈活控制校驗(yàn)規(guī)則,本文介紹springboot的實(shí)體類字段校驗(yàn)的分組校驗(yàn),感興趣的朋友一起看看吧
    2025-03-03
  • spring cloud實(shí)現(xiàn)前端跨域問題的解決方案

    spring cloud實(shí)現(xiàn)前端跨域問題的解決方案

    這篇文章主要介紹了 spring cloud實(shí)現(xiàn)前端跨域問題的解決方案,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-01-01
  • SpringBoot中AOP的多種用途與實(shí)踐指南

    SpringBoot中AOP的多種用途與實(shí)踐指南

    Spring Boot結(jié)合AOP提供了強(qiáng)大的功能,可以用于日志記錄、性能監(jiān)控、異常處理、權(quán)限校驗(yàn)等多種場(chǎng)景,通過AOP,我們可以將橫切關(guān)注點(diǎn)從業(yè)務(wù)邏輯中分離出來,從而提高代碼的可維護(hù)性和可讀性,下面就來一起了解一下
    2026-03-03
  • SpringBoot使用前綴樹實(shí)現(xiàn)敏感詞過濾示例

    SpringBoot使用前綴樹實(shí)現(xiàn)敏感詞過濾示例

    最近項(xiàng)目用到了敏感詞過濾,本文主要就來介紹一下SpringBoot使用前綴樹實(shí)現(xiàn)敏感詞過濾示例,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-10-10
  • mybatis+lombok出現(xiàn)java.lang.IndexOutOfBoundsException錯(cuò)誤及解決

    mybatis+lombok出現(xiàn)java.lang.IndexOutOfBoundsException錯(cuò)誤及解決

    在使用MyBatis和Lombok時(shí),如果遇到j(luò)ava.lang.IndexOutOfBoundsException問題,是因?yàn)镸yBatis在嘗試將查詢結(jié)果封裝成Java對(duì)象時(shí),找不到構(gòu)造函數(shù)中對(duì)應(yīng)的字段,這通常是由于Lombok的@Builder注解生成了全參構(gòu)造函數(shù)
    2025-02-02
  • java 類加載機(jī)制和反射詳解及實(shí)例代碼

    java 類加載機(jī)制和反射詳解及實(shí)例代碼

    這篇文章主要介紹了java 類加載機(jī)制和反射詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • Java中保證線程順序執(zhí)行的四種實(shí)現(xiàn)方式

    Java中保證線程順序執(zhí)行的四種實(shí)現(xiàn)方式

    在多線程編程中,線程的并發(fā)執(zhí)行通常是不可預(yù)知的,然而在某些應(yīng)用場(chǎng)景中,我們需要確保多個(gè)線程按特定的順序執(zhí)行,本文將介紹幾種常見的方式,幫助我們?cè)诙嗑€程中保證執(zhí)行順序,需要的朋友可以參考下
    2025-08-08
  • Java數(shù)據(jù)類型Integer與int的區(qū)別詳細(xì)解析

    Java數(shù)據(jù)類型Integer與int的區(qū)別詳細(xì)解析

    這篇文章主要介紹了Java數(shù)據(jù)類型Integer與int的區(qū)別詳細(xì)解析,Ingeter是int的包裝類,int的初值為0,Ingeter的初值為null,int和integer(無論new否)比,都為true,因?yàn)闀?huì)把Integer自動(dòng)拆箱為int再去比,需要的朋友可以參考下
    2023-12-12
  • 實(shí)例講解分布式緩存軟件Memcached的Java客戶端使用

    實(shí)例講解分布式緩存軟件Memcached的Java客戶端使用

    這篇文章主要介紹了分布式緩存軟件Memcached的Java客戶端使用,Memcached在GitHub上開源,作者用其Windows平臺(tái)下的版本進(jìn)行演示,需要的朋友可以參考下
    2016-01-01

最新評(píng)論

小金县| 宁津县| 定南县| 南乐县| 徐州市| 望谟县| 新疆| 广宁县| 台前县| 淮阳县| 阿克陶县| 蒙山县| 泾川县| 呼伦贝尔市| 积石山| 巍山| 德清县| 霞浦县| 东方市| 西林县| 临猗县| 东海县| 巴彦淖尔市| 房产| 科技| 桃园县| 石泉县| 那坡县| 东明县| 杨浦区| 阳泉市| 西充县| 博兴县| 麻江县| 陈巴尔虎旗| 略阳县| 章丘市| 高雄市| 仙桃市| 张北县| 永城市|