J2ME 多線程替代方案:Timer + TimerTask 實作詳解
除了繼承 Thread、實作 Runnable,J2ME 可利用 java.util.Timer 與 TimerTask 組合實現結構清晰的多線程排程。本文說明原理、API 用法並提供完整範例:螢幕數字遞增,按鍵 5 暫停/繼續。
核心類別職責
- Timer:定時器,負責排程。方法:
schedule(task, delay, period), scheduleAtFixedRate(...), cancel() (停止所有任務)。
- TimerTask:抽象類別,繼承並實作
run() 定義任務邏輯。方法:cancel() (停止自身)。
優缺點比較
| 維度 | Thread/Runnable | Timer/TimerTask |
| 程式碼結構 | 較分散 | 清晰,任務封裝於獨立類別 |
| 多任務管理 | 自行管理 | Timer 統一排程、啟停 |
| 類別數量 | 少 | 多 (每任務一 TimerTask) |
| 系統開銷 | 低 | 稍高 |
完整範例:數字遞增畫面
package shandong;
import java.util.*;
import javax.microedition.lcdui.*;
public class NumberCanvas extends Canvas {
private Timer timer;
private int number = 0;
private int width, height;
public NumberCanvas() {
width = getWidth();
height = getHeight();
start();
}
private void start() {
if (timer == null) {
timer = new Timer();
timer.schedule(new NumberTimerTask(), 0, 300); // 立即開始,每 300ms 執行
}
}
private void stop() {
if (timer != null) {
timer.cancel();
timer = null;
}
}
public void keyPressed(int keyCode) {
if (keyCode == Canvas.KEY_NUM5) {
if (timer == null) start(); else stop();
}
}
protected void paint(Graphics g) {
g.setColor(0xFFFFFF);
g.fillRect(0, 0, width, height);
g.setColor(0x000000);
g.drawString(String.valueOf(number), 50, 50, Graphics.TOP | Graphics.LEFT);
}
// 內部類別:定時任務
class NumberTimerTask extends TimerTask {
public void run() {
number++;
repaint(); // 觸發 paint()
}
}
}
關鍵點說明
timer.schedule(task, 0, 300):delay=0 立即執行首次,period=300 毫秒週期。
repaint() 在非事件執行緒中呼叫安全,系統會排程重繪。
- 按鍵處理中透過
timer == null 判斷狀態,切換啟停。
timer.cancel() 會停止所有已排程任務並釋放資源,後續不可重用該 Timer 實例,需 new 新實例。
適用場景
- 遊戲主迴圈 (固定幀率更新邏輯/繪圖)。
- 週期性網路輪詢、資料同步。
- 動畫、倒數計時器等定時觸發需求。
- 上一篇文章: 解決 NetBeans 4.0/5.0 運行 J2ME 專案「域名不正確,請切換到 untrusted」錯誤
- 下一篇文章: 手機 IMEI 號碼結構解析與 J2ME 獲取方法總結
Copyright ©
程式碼之家 All Rights Reserved