gpt4 book ai didi

java - 从另一个线程调用 timer.cancel() 后,TimerTask 不会立即停止?

转载 作者:太空宇宙 更新时间:2023-11-04 11:15:38 25 4
gpt4 key购买 nike

我有一个小程序可以执行以下操作:主线程和线程 t1 循环请求某些内容,按钮将停止两者。

public class HttpsConn {
private static boolean stop = false;
private static Timer t = null;

public static void main(String[] arg) {
t = new Timer();
A a = new A();
t.schedule(a, 0, 1000);
B b = new B();
Thread t1 = new Thread(b);
t1.start();
}
static class A extends TimerTask {
@Override
public void run() {
if (stop)
t.cancel(); //this.cancel();
System.out.println("something to do");
}
}
static class B extends A implements Runnable {
@Override
public void run() {
System.out.println("simulate an operation from Swing Applet (click RESET button) to interrupt the thread.");
stop = true;
}
}
}

我除了结果:

something to do
simulate an operation from Swing Applet (click RESET button) to interrupt the thread.

我得到了什么:

something to do
simulate an operation from Swing Applet (click RESET button) to interrupt the thread.
something to do

我发现类似的问题here ,答案是从 run() 中调用取消,但它在这里似乎不起作用。那么如何避免意外跑动呢?注释行中的 t.cancel()this.cancel() 有什么区别?它们会导致相同的结果。谢谢!

最佳答案

您的 A 计划运行,初始延迟为 0 秒,后续延迟为 1 秒。

第一个要做的事情是在0延迟后第一次执行。尚未设置 stop 标志,因此它只是打印并退出。

一秒钟后,计时器再次调用它。它检查 stop 标志,取消计时器(因为 B 已执行并设置它)并打印第二个 something to do。它不应再次运行,因为计时器任务现已取消。

为了避免这种看似奇怪的行为,您可以使用以下内容:

        if (!stop) {
System.out.println("something to do");
} else {
t.cancel(); //this.cancel();
}

请记住,cancel 仅取消 Timer,它不会中止 Runnable 的执行。

关于java - 从另一个线程调用 timer.cancel() 后,TimerTask 不会立即停止?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45484952/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com