J2ME (KVM) 提供完整 Java 多線程 API 子集,支援網路連線、UI 調度、遊戲迴圈等並發場景。本文系統整理繼承 Thread、實現 Runnable、Timer/TimerTask 三種實現方式與關鍵方法。
public class MyThread extends Thread {
public void run() {
// 執行邏輯
}
}
// 啟動
new MyThread().start();
public class MyRunnable implements Runnable {
public void run() {
// 執行邏輯
}
}
// 啟動
new Thread(new MyRunnable()).start();
public class MyTimerTask extends TimerTask {
public void run() {
// 定期執行邏輯
}
}
// 調度
Timer timer = new Timer();
timer.schedule(new MyTimerTask(), 3000); // 3秒後執行一次
timer.schedule(new MyTimerTask(), 3000, 5000); // 3秒後每5秒執行
// 取消
timer.cancel();
| 方法 | 用途 | 注意 |
|---|---|---|
| `setPriority(int)` | 設定優先級 (1-10) | 調度非確定性,僅作提示 |
| `sleep(long ms)` | 靜態方法,當前線程休眠 | 拋 `InterruptedException`,需捕獲 |
| `start()` | 啟動線程 (進入可執行態) | 非 `run()` 直接調用! |
| `run()` | 線程執行主體 | 由 `start()` 間接觸發 |
| `join()` | 等待線程終止 | 可帶超時參數 `join(ms)` |
| `isAlive()` | 判斷是否存活 | |
| `yield()` | 讓出 CPU 時間片 | 靜態方法,禮讓同優先級線程 |
public void commandAction(Command c, Displayable s) {
if (c == do1Cmd) {
// 網路操作:實現 Runnable
new Thread(new NetworkRunnable()).start();
} else if (c == do2Cmd) {
// 本地計算:繼承 Thread
new CalculationThread().start();
} else {
// 週期性更新:TimerTask
new Timer().schedule(new UITimerTask(), 3000, 20);
}
}
核心原則:MIDP 事件分發線程 (EDT) 必須極快返回,耗時操作 (HTTP、RMS 存儲、大量計算) 必須移至背景線程,否則導致 UI 凍結、按鍵無響應、甚至系統判定應用無反應強制殺掉。
| J2ME | Android | 核心變化 |
|---|---|---|
| Thread / Runnable | Thread / Runnable / ExecutorService | 線程池標準化 |
| TimerTask | Handler / ScheduledExecutorService | 更精確調度、生命週期綁定 |
| callSerially | runOnUiThread / View.post | 同樣解決 UI 線程安全 |
| 無異步框架 | AsyncTask / Coroutines / RxJava | 結構化並發、取消傳播 |
J2ME 多線程基礎仍是理解移動端並發的基石,核心模式「事件線程不做重活」貫穿始終。