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

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

 更新時(shí)間:2023年07月21日 14:58:57   作者:huayang183  
這篇文章主要介紹了springboot如何添加task任務(wù)執(zhí)行隊(duì)列問(wèn)題,具有很好的參考價(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)類(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)文章

最新評(píng)論

崇信县| 监利县| 宁南县| 循化| 会理县| 加查县| 常熟市| 扬中市| 卫辉市| 邵武市| 孟州市| 大余县| 乐平市| 瑞昌市| 和硕县| 曲麻莱县| 时尚| 静宁县| 惠东县| 睢宁县| 昆明市| 鹤山市| 娱乐| 石屏县| 习水县| 鄂托克前旗| 如东县| 日喀则市| 雅安市| 新平| 仙桃市| 都安| 金坛市| 金门县| 都江堰市| 阿尔山市| 六枝特区| 昌图县| 长泰县| 安图县| 高唐县|