创建定时任务时,如果我们不主动去取消定时任务,我们需要的任务内容执行完毕,但定时任务不会关闭。
启动定时任务时,相当于启动一个分线程,
下面写了两种:
一是通过定义参数,创建对象时,将定时器对象传入构造方法,从而确保我们关闭的是我们主动开启的那个任务
二是直接对当前线程进行中断、停止、销毁,后两种已经不推荐使用已经过时了
package timer;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
public class Demo
{
public static void main(String[] args) throws InterruptedException{
works();
}
/**
* 该方法验证的是有参构造方法的Works
* 使用定时器取消任务
* 定时器对象如何被继承TimerTask的类获取
* @throws InterruptedException
*/
public static void works() throws InterruptedException {
Timer t1 = new Timer();
Works w = new Works(t1);
t1.schedule(w, 6000);
for(int i=5;i>0;i--)
{
Thread.sleep(1000);
System.out.println("任务还有"+i+"s"+"开启"+" "+"主线程线程名为:"+Thread.currentThread().getName());
}
while(true)
{
Date date=new Date();
SimpleDateFormat da=new SimpleDateFormat("HH:mm:ss");
Thread.sleep(1000);
System.out.println(da.format(date)+" "+Thread.currentThread().getName());
}
}
}
class Works extends TimerTask{
public Timer t;
public String TName;
/**
* 构造方法,获取需要暂停的任务
* @param t1
*/
public Works(Timer t1) {
// TODO Auto-generated constructor stub
this.t = t1;
}
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("定时任务为:该吃饭了!");
System.out.println("定时任务即将关闭!");
can1();
//can2();
}
public void can1(){
// for(int i=3;i>0;i--)
// {
// try {
// Thread.sleep(1000);
//
// } catch (InterruptedException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
// TName = Thread.currentThread().getName();
// System.out.println("倒计时: "+i+"s"+" "+TName);
// }
// t.cancel();
// System.out.println("任务已关闭");
int m=10;
while(m>0)
{
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
TName = Thread.currentThread().getName();
System.out.println("定时任务仍在继续: "+m+"s"+" "+"定时任务线程名:"+TName);
m--;
}
t.cancel();
System.out.println("任务已关闭");
}
public void can2() {
for(int i=3;i>0;i--)
{
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("倒计时: "+i+"s");
}
//Thread.currentThread().stop();
//Thread.currentThread().destroy();
Thread.currentThread().interrupt();
System.out.println("任务已关闭");
}
}