public void go() {
while (true) {
Thread.currentThread().sleep(100);
if (runFlag) t.setText(String.valueOf(count++));
}
}
class StartL implements ActionListener {
public void actionPerformed(ActionEvent e) { go(); } // 永不返回!
}
按下 Start 後,actionPerformed() 進入無限循環,**事件派發執行緒 (EDT) 被佔用**,無法處理任何其他事件(包括 Toggle、視窗關閉),介面徹底凍結,只能強制終止程式。
傳統單執行緒模型中,**耗時任務與 UI 更新共用同一執行緒**。go() 需持續運行卻必須返回以釋放 EDT,這在單執行緒下屬於「不可能三角」。
將耗時任務移至**獨立工作執行緒**,EDT 專責事件分派與 UI 更新。Java 內建多執行緒支援,CPU 以時間片輪轉方式讓多執行緒「同時」運行,實現真正的並發響應。
class CounterThread extends Thread {
public void run() {
while (true) {
if (runFlag) SwingUtilities.invokeLater(() -> t.setText(String.valueOf(count++)));
try { sleep(100); } catch (InterruptedException ignored) {}
}
}
}
// Start 按鈕:new CounterThread().start();
private final ExecutorService executor = Executors.newSingleThreadExecutor();
private final AtomicInteger count = new AtomicInteger(0);
private volatile boolean runFlag = true;
class StartL implements ActionListener {
public void actionPerformed(ActionEvent e) {
executor.submit(() -> {
while (runFlag) {
final int c = count.incrementAndGet();
SwingUtilities.invokeLater(() -> t.setText(String.valueOf(c)));
try { Thread.sleep(100); } catch (InterruptedException ex) { break; }
}
});
}
}
// 關閉視窗時:executor.shutdown();
SwingUtilities.invokeLater() 或 invokeAndWait()。volatile、Atomic*、synchronized、Lock 保護旗標與計數器。interrupt()、shutdown()),避免資源洩漏。ExecutorService、ScheduledExecutorService、CompletableFuture、SwingWorker 替代手動 Thread 管理。多執行緒不僅解決響應性問題,在多核心處理器上更能**真正並行**執行計算密集型任務,大幅提升吞吐量。作業系統自動將執行緒調度至不同核心,Java 應用無需修改即可受益。
從凍結的 Counter1 到流暢的多執行緒架構,核心在於**職責分離**:EDT 專注 UI,工作執行緒專注業務。掌握這一原則,配合現代併發 API,即能構建高響應、高吞吐、穩健的桌面應用程式。