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("任務已關閉");
}
}