欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • Java之單鏈表問題解決案例講解

    Java之單鏈表問題解決案例講解

    這篇文章主要介紹了Java之單鏈表問題解決案例講解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下
    2021-08-08
  • Tomcat調優(yōu)詳解

    Tomcat調優(yōu)詳解

    這篇文章主要介紹了Tomcat調優(yōu)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • dubbo?filter中有關bean注入和配置文件讀取方式

    dubbo?filter中有關bean注入和配置文件讀取方式

    這篇文章主要介紹了dubbo?filter中有關bean注入和配置文件讀取方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • Spring?createBeanInstance實例化Bean

    Spring?createBeanInstance實例化Bean

    這篇文章主要為大家介紹了Spring?createBeanInstance實例化Bean源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • Spring中的NamespaceHandler加載過程源碼詳解

    Spring中的NamespaceHandler加載過程源碼詳解

    這篇文章主要介紹了Spring中的NamespaceHandler加載過程源碼詳解,Spring提供的NamespaceHandler的處理機制,簡單來說就是命名空間處理器,Spring為了開放性提供了NamespaceHandler機制,這樣我們就可以根據(jù)需求自己來處理我們設置的標簽元素,需要的朋友可以參考下
    2024-02-02
  • Java Validation Api如何實現(xiàn)自定義注解

    Java Validation Api如何實現(xiàn)自定義注解

    這篇文章主要介紹了Java Validation Api如何實現(xiàn)自定義注解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-09-09
  • 一篇文章帶你入門Java基本概念

    一篇文章帶你入門Java基本概念

    本文主要介紹了Java編程的基本概念基本概念,可以幫助我們更加深刻的所要講解的Java命令,具有很好的參考價值。下面跟著小編一起來看下吧,希望能給你帶來幫助
    2021-08-08
  • 使用Java對Hbase操作總結及示例代碼

    使用Java對Hbase操作總結及示例代碼

    這篇文章主要介紹了使用Java對Hbase進行操作總結,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-07-07
  • springboot aop添加日志方式

    springboot aop添加日志方式

    這篇文章主要介紹了springboot aop添加日志方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • Mybatis 插入一條或批量插入 返回帶有自增長主鍵記錄的實例

    Mybatis 插入一條或批量插入 返回帶有自增長主鍵記錄的實例

    下面小編就為大家分享一篇Mybatis 插入一條或批量插入 返回帶有自增長主鍵記錄的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-12-12

最新評論