Timer和TimerTask 调用与取消

来源:互联网 发布:ntfs.sys windows 10 编辑:程序博客网 时间:2024/06/06 07:06

当任务被执行,与被取消 同一时间调用,怎么才知取消成功没?

先上个例子:


package Timer;
import java.sql.Time;
import java.util.Timer;
import java.util.TimerTask;


/***
 * 测试任务调度与取消
 * 
 * @author Administrator
 * 
 */
public class Mytimer {


Timer timer = new Timer("aa");
MyTask mytask = new MyTask();


public boolean cancelMytask() {
timer.cancel();
return mytask.cancel();

}


public void scheduleTask() {
try {
timer.schedule(mytask, 3000);
} catch (Exception e) {
e.getStackTrace();
}

}

}





package Timer;


import java.util.Date;
import java.util.TimerTask;


public class MyTask extends TimerTask {


@Override
public void run() {


System.out.println("我正在执行中任务............"+new Date().toLocaleString());
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("已经执行完任务了!"+new Date().toLocaleString());
}
}



package Timer;


import java.util.Date;
import java.util.Timer;


public class Worker implements Runnable {


private String name;


private Mytimer timer;


public Worker(String name, Mytimer timer) {
this.name = name;
this.timer = timer;
}


@Override
public void run() {
System.out.println("我是:" + name);
try {
timer.scheduleTask();
} catch (Exception e) {
System.out.println("任務被非正常取消"+new Date().toGMTString());
}
}


};


package Timer;


import java.util.Date;
import java.util.Timer;


public class Worker2 implements Runnable {


private String name;


private Mytimer timer;


public Worker2(String name, Mytimer timer) {
this.name = name;
this.timer = timer;
}


@Override
public void run() {
System.out.println("我是:" + name);
   try {
Thread.sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
boolean flag=timer.cancelMytask();
System.out.println( name+"取消了任务" +(flag?"成功":"失敗" )+new Date().toLocaleString());
}


};



package Timer;


import java.util.Timer;


public class MainTest {
public static void main(String args[]) {

Mytimer timer = new Mytimer();


new Thread(new Worker("小明", timer)).start();


new Thread(new Worker2("小新", timer)).start();


}
}




Mytimer  类中,Timer 与TimerTask  的cancel的区别是:

TimerTask   的cancel 是有返回值的而,TimerTask  的cancel 是释放当前的任务,无论成功与否

Timer 不取消的话,线程会一直挂在那。所以上面两个都调用了.

文中都是三秒后worker 和Worker2同时执行和取消任务,

那么哪个会调用成功?得看jvm了


原创粉丝点击