当任务被执行,与被取消 同一时间调用,怎么才知取消成功没?
先上个例子:
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了