取消后,Timer()线程仍在运行

时间:2014-05-06 01:44:56

标签: java android multithreading timer

我不知道为什么即使我取消它后线程仍然存在?在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();
    }
}

1 个答案:

答案 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以确定您确实知道它。