线程占用的资源。
同样的功能也可以使用Timer和TimerTask组合的方式实现,实现的代码如下所示:
package example1;
import java.io.*;
/**
* 模拟定时炸弹线程
*/
public class TestTimeBomb2 {
public static void main(String[] args) {
//创建线程和启动线程
TimeBombTimerTask tbtt = new TimeBombTimerTask();
//接受控制台输入
BufferedReader br = new BufferedReader(
new InputStreamReader(System.in));
String line;
try{
while(true){
System.out.println("输入quit结束线程:");
//获得控制台输入
line = br.readLine();
//判断是否是quit
if(line.equals("quit")){
tbtt.stopThread(); //结束线程
break; //结束循环
}
}
}catch(Exception e){}
}
}
package example1;
import java.util.*;
/**
* 使用Timer和TimerTask组合模拟定时炸弹
*/
public class TimeBombTimerTask extends TimerTask {
int n;
Timer t;
boolean isRun;
public TimeBombTimerTask(){
n = 60;
isRun = true;
t = new Timer();
t.schedule(this, 0); //启动线程
}
public void run() {
try{
while(isRun){
Thread.sleep(1000); //延迟1秒
System.out.println("剩余时间:" + n);
if(n <= 0){
stopThread(); //结束线程
System.out.println("炸弹爆炸!");
break; //结束循环
}
n--; //时间减少1
}
}catch(Exception e){}
}
public void stopThread(){
isRun = false;
t.cancel();
}
}
在该示例代码中,实现的原理和前面的类似,TestTimeBomb2类实现系统线程,功能是启动模拟定时炸弹的线程,并接收用户的控制台输入。而TimeBombTimerTask类实现模拟定时炸弹的线程,在该类内部包含启动线程的Timer对象,当构造该类的对象时,不仅完成该类的初始化,而且启动线程。
在控制Timer启动的线程结束时,首先结束当前的TimerTask线程,然后再调用Timer对象的cancel方法结束Timer对象的线程,这样才可以真正停止这种方式启动的线程。
至于使用实现Runnable方式实现线程的方式,和继承Thread类的实现几乎一致,读者可以根据第一种方式的实现独自进行实现,这里就不再重复实现了。 |