眾所周知,Java語言在語言的低層就支持多線程,在Java中可以使用兩種方式來實現多線程操作,這兩種方式依次是:
1、繼承Thread類
2、實現Runnable接口
但是Java語言中還有兩個類,可以組合來實現多線程的控制,這兩個類就是Java.util包中的Timer和TimerTask類。和上面的實現方式相比,使用這種方式來實現多線程,可以很方便的開啟多個線程,並且代碼的結構比較清晰,但是創建類的數量比較多,系統開銷稍微大一些。下面詳細進行一下介紹:
Timer類是一個定時器,可以每隔一段固定的時間做一件事情,而且可以很方便的停止這些動作。依次為:
構造對象: Timer timer = new Timer();
對象創建以後,可以使用其中的schedule或者是scheduleAtFixedRate方法起啟動一個任務(Task)動作。需要停止時,可以調用Timer對象的cancel方法實現,該方法可以停止該Timer啟動的所有任務(Task)。
TimerTask類是一個線程類,所有線程的動作代碼都寫在該類內部。TimerTask是一個抽象類,在實際使用過程中,一般是繼承TimerTask類,然後實現實際的操作,停止TimerTask可以使用TimerTask對象裡面的cancel方法。
下面是一個實現簡單的數字變化的J2ME代碼:
package; shandong import Java.util.*;
import Javax.microedition.lcdui.*;
/**
* 使用Timer和TimerTask實現多線程
* 該代碼實現的功能是屏幕上的數字一直增加,按下5鍵暫停,再次按下5鍵繼續增加
*/
public class NumberCanvas extends Canvas {
/**定時器*/
Timer timer;
/**屏幕上顯示的數字*/
private int number = 0;
/**屏幕寬度*/
private int width;
/**屏幕高度*/
private int height;
public NumberCanvas() {
//獲得屏幕的高度和寬度
width = this.getWidth();
height = this.getHeight();
//啟動線程
start();
}
/**
* 啟動線程
*/
private void start(){
if(timer == null){
//啟動定時器
timer = new Timer();
timer.schedule(new NumberTimerTask(),0,300);
}
}
/**
* 停止線程
*/
private void stop(){ if(timer != null){
//停止線程
timer.cancel();
timer = null;
}
}
/**
* 按鍵處理
* @param keyCode int 按下的鍵值
*/
public void keyPressed(int keyCode){
//判斷按下的數字鍵5
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);
}
/**
* 線程任務動作
*/
public class NumberTimerTask extends TimerTask{
public void run(){
//數字增加
number++;
//重繪
repaint();
}
}
}