在Java中可以使用两种方式来实现多线程操作,这两种方式依次是:
Timer类—定时器类派生自Object。它是个定时器类,作为后台线程,执行未来的任务。任务可安排一次性执行,或定期重复执行。于每个
Timer对象对应的是用于执行该定时器的所有任务的单个后台线程。Timer类是安全的线程类:多个线程可以共享一个定时器,而不需要一个外部同步定时器对象(external synchronization)。Timer类不提供实时保证:它使用Object.wait方法执行任务。
TimerTask类—定时器任务类。它是一个抽象类,需要覆盖重写实现想要执行的任务,所有线程执行的任务代码都写在该类内部。TimerTask应快速完成。如果一个计时器任务需要过多的时间来完成,会延误后续任务的执行,有问题的任务完成后,可能会“聚成一团“,进而及时执行。
构造Timer 对象: Timer timer = new Timer();
对象创建以后,可以使用其中的schedule或者是scheduleAtFixedRate方法起启动一个任务(Task)动作。需要停止时,可以调用Timer对象的cancel方法实现,该方法可以停止该Timer启动的所有任务(Task)。
下面是一个简单的例子:
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();
}
}
}
1、继承Thread类
2、实现Runnable接口
但是Java语言中还有两个类,可以组合来实现多线程的控制,这两个类就是java.util包中的Timer和TimerTask类。