我不知道为什么即使我取消它后线程仍然存在?在Timer
线程实现runnable
下面的代码中,在代码中我希望它使用Thread.sleep(7000);
保持运行7秒,之后我调用mTimer.cancel();
来杀死线程。在7秒内,应调用run()
方法来执行将持续10秒的任务。当我执行那个程序时,第一行的时间是12:18:37
并且正如我预期的那样,因为这个帖子在我取消之前只会活7秒,但第二行的显示时间是{{1现在这是7秒的差异,这是理性的。但出乎意料的是,3秒钟后,控制台上又出现了另一条线路,它被定时到05 12:18:44
。如果您注意到第一行和第三行之间的差异,您会发现它有10秒钟。我的问题是,为什么整个线程在7秒后没有死亡。
JavaCode:
05 12:18:47
}
输出:
public class TimerTaskExample extends TimerTask {
private static Timer mTimer;
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("going to sleep at: " + new Date());
dosomeWorks();
System.out.println("returned back at: " + new Date());
}
private void dosomeWorks() {
// TODO Auto-generated method stub
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String args[]) {
TimerTask timerTask = new TimerTaskExample();
mTimer = new Timer(true);
mTimer.scheduleAtFixedRate(timerTask, new Date(), 2*1000);
//System.out.println("timer will start now at: " + new Date());
try {
Thread.sleep(7000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
mTimer.cancel();
System.out.println("timer is cancelled now at: " + new Date());
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
答案 0 :(得分:2)
取消TimerTask不会中断它的执行 - 它只是阻止它再次被执行。
如果你想让线程停止执行,你需要在某处隐藏对java.lang.Thread的引用并中断它。
假设你在线程中做了真正的工作,你还需要轮询Thread.interrupted()来检查它是否应该继续。
private Thread taskThread;
@Override
public void run() {
taskThread = Thread.currentThread();
System.out.println("going to sleep at: " + new Date());
doSomeWorks();
System.out.println("returned back at: " + new Date());
}
private void dosomeWorks() {
for (int i = 0; !Thread.interrupted() && i < 10; ++i) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
...
mTimer.cancel();
timerTask.taskThread.interrupt();
...
请务必阅读Thread.interrupt()的javadoc以确定您确实知道它。