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

Java 長時間任務框架設計:Worker 模式實現健壯後台處理

     編輯:Java 程式設計入門

背景與痛點

企業級應用(數據處理、監聽事件、門禁系統等)大量存在長時間運行任務。直接操作 Thread、Lock、Notification 代碼冗長、易錯、難維護。需要一個可復用框架降低多線程編程風險。

核心抽象:Worker 基類

Worker 實現 Runnable,封裝線程生命週期、資源準備/釋放、錯誤處理、暫停/恢復、優雅停止:

關鍵模板方法

  • prepareWorker(): 線程啟動前調用,分配資料庫連接、Socket、文件句柄等阻塞資源。在獨立線程中執行不阻塞主線程。
  • work(): 核心業務邏輯(數據處理、事件響應、SQL 執行等)。拋出異常由 run() 捕獲處理。框架自動循環調用,無需手寫 while。
  • releaseWorker(): 線程退出前調用,釋放資源、清理現場。類似 finalize() 但確定性調用。
  • handleError(Throwable t): 統一錯誤處理入口,可記錄日誌、決定是否調用 halt() 停止任務。
  • isCondition(): 細粒度控制 work() 執行條件(如緩衝區非空)。條件不滿足時按 setTimeout() 週期等待鎖通知。

生命週期控制方法

  • isRunning():檢查任務運行狀態。
  • broadcast():通知鎖對象喚醒等待線程。
  • halt():停止任務,通知鎖並設置停止標誌。若阻塞對象不響應 interrupt()(如 JDBC 執行),需額外添加顯式通知或調用 Thread.interrupt()。

實現範例

public abstract class Worker implements Runnable {
    private volatile boolean running = false;
    private final Object lock = new Object();
    private long timeout = 1000; // 默認檢查週期

    public final void run() {
        try { prepareWorker(); }
        catch (Throwable t) { handleError(t); return; }

        running = true;
        while (running) {
            try {
                if (isCondition()) {
                    work();
                } else {
                    synchronized (lock) { lock.wait(timeout); }
                }
            } catch (Throwable t) { handleError(t); }
        }
        releaseWorker();
    }

    // 模板方法(子類實現)
    protected abstract void prepareWorker();
    protected abstract void work();
    protected abstract void releaseWorker();
    protected abstract boolean isCondition();
    protected abstract void handleError(Throwable t);

    // 控制方法
    public final boolean isRunning() { return running; }
    public final void halt() { running = false; broadcast(); }
    public final void broadcast() { synchronized (lock) { lock.notifyAll(); } }
    public void setTimeout(long ms) { timeout = ms; }
}

使用方式

// 1. 繼承 Worker 實現業務邏輯
class DataProcessor extends Worker { ... }

// 2. 啟動
new Thread(new DataProcessor()).start();

// 3. 關閉鉤子優雅停止所有任務
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
    worker.halt();
    // 可選:worker.join() 等待結束
}));

框架優勢

  • 統一異常處理與資源管理,減少樣板代碼。
  • 條件等待機制避免忙等待,降低 CPU 佔用。
  • 優雅停止協議配合關閉鉤子,保證應用安全退出。
  • 基於 Runnable 而非繼承 Thread,兼容線程池、虛擬線程(Java 21+)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved