首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

自製可控 Java Web 後台任務執行器:支援啟停、單執行緒佇列與優雅關閉

     編輯:Java 相關知識

背景與痛點

專案常需在 Web 容器中運行長期後台任務(如資料同步、報表生成、訊息推播)。標準 Timer 或 Quartz 皆為「定時觸發」模型,難以滿足以下業務需求:

  • 任務不隨容器啟動自動執行,需由管理頁面手動啟動/停止/重啟
  • 單一任務單執行緒串行,避免並發衝突
  • 關閉指令下達後,等待當前任務完成再釋放資源(優雅關閉)
  • 無現成開箱即用組件,需自行實作

核心設計思路

狀態機模型

任務本質是一個受控執行緒,狀態僅有 RUNNING / STOPPED。以 volatile boolean 做開關旗標,while(switch) { doWork(); } 迴圈即可實現啟停控制。

關鍵類別結構

MyTask (extends Thread)
 ├─ volatile boolean runningFlag
 ├─ run()          // while(runningFlag) { businessLogic(); }
 ├─ startTask()    // CAS 設定 flag=true 並 start()
 └─ stopTask()     // flag=false,等待 run() 自然結束

TaskExecutor (單例)
 ├─ synchronized execute()  // 確保同一時間僅啟動一個任務執行緒
 └─ 持有 MyTask 實例引用

Web 控制介面

三個極簡 JSP 頁面即可:

  • index.jsp:顯示狀態,提供「啟動」「關閉」超連結
  • on.jsp:呼叫 MyTask.startTask() + TaskExecutor.execute()
  • off.jsp:呼叫 MyTask.stopTask()

核心程式碼實作(精簡版)

public class MyTask extends Thread {
    private volatile boolean running = false;

    @Override
    public void run() {
        while (running) {
            // 實際業務邏輯
            doBusinessWork();
        }
        System.out.println("任務執行緒已安全結束");
    }

    public synchronized void startTask() {
        if (!running) {
            running = true;
            this.start(); // 啟動執行緒
        }
    }

    public synchronized void stopTask() {
        running = false; // 讓 while 迴圈自然跳出
    }
}

public class TaskExecutor {
    private static final TaskExecutor INSTANCE = new TaskExecutor();
    private MyTask currentTask;

    private TaskExecutor() {}

    public static TaskExecutor getInstance() { return INSTANCE; }

    public synchronized void execute() throws InterruptedException {
        if (currentTask != null && currentTask.isAlive()) {
            throw new IllegalStateException("任務已在執行中");
        }
        currentTask = new MyTask();
        currentTask.startTask();
        // 短暫等待確認執行緒啟動
        Thread.sleep(100);
    }
}

優雅關閉的關鍵細節

  1. volatile 保證旗標跨執行緒可見性
  2. stopTask() 僅置旗標,不呼叫 deprecated 的 Thread.stop()
  3. 業務邏輯 doBusinessWork() 應可被中斷或具備檢查點,避免長時間阻塞導致關閉等待過久
  4. 生產環境建議加入 join(timeout) 超時強制中斷機制
  5. 擴展方向

    • 引入執行緒池管理多任務,支援優先級佇列
    • 整合 Spring @Scheduled 或 Quartz 做定時觸發,保留手動控制介面
    • 加入任務執行日誌、進度追蹤、失敗重試策略
    • RESTful API 取代 JSP,配合前端儀表板實現可視化運維

    總結

    以 狀態旗標 + 單執行緒迴圈 + 同步控制 為核心,僅百行程式碼即可構建符合業務強控制需求的後台任務執行器。這不僅解決當下問題,更展示「簡單設計」在特定場景下的工程價值。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved