Java定时任务关闭

创建定时任务时,如果我们不主动去取消定时任务,我们需要的任务内容执行完毕,但定时任务不会关闭。

启动定时任务时,相当于启动一个分线程,

下面写了两种:

一是通过定义参数,创建对象时,将定时器对象传入构造方法,从而确保我们关闭的是我们主动开启的那个任务

二是直接对当前线程进行中断、停止、销毁,后两种已经不推荐使用已经过时了


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("任务已关闭");
	}
}


你可能感兴趣的:(Java,多线程)