企業級應用(數據處理、監聽事件、門禁系統等)大量存在長時間運行任務。直接操作 Thread、Lock、Notification 代碼冗長、易錯、難維護。需要一個可復用框架降低多線程編程風險。
Worker 實現 Runnable,封裝線程生命週期、資源準備/釋放、錯誤處理、暫停/恢復、優雅停止:
run() 捕獲處理。框架自動循環調用,無需手寫 while。finalize() 但確定性調用。halt() 停止任務。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() 等待結束
}));
Runnable 而非繼承 Thread,兼容線程池、虛擬線程(Java 21+)。