gpt4 book ai didi

Java - 计时器在执行后未被删除

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:17:06 26 4
gpt4 key购买 nike

我有一个启动计时器的应用程序,它会在用户操作时显示一条消息。在 JDK 分析器中,似乎所有其他线程在 GC 执行后都被删除(我猜),但创建的计时器没有被删除。那里会发生什么?

我的计时器:

/**
* @param owner
* @param added
*/
public static void splashParentWithAnimation(AnchorPane owner, Parent added,double posX,double posY) {
// addParentWithAnimation(owner, added);
owner.getChildren().add(added);

AnchorPane.setLeftAnchor(added, posX);

AnchorPane.setTopAnchor(added, posY);

FadeTransition ft1 = new FadeTransition(Duration.millis(300), added);
ft1.setFromValue(0.0);
ft1.setToValue(1.0);
ft1.play();


Timer messagePrinter = new Timer();
messagePrinter.schedule(new TimerTask() {

@Override
public void run() {
Platform.runLater(() -> {

if (!owner.getChildren().contains(added))
return;

FadeTransition ft1 = new FadeTransition(Duration.millis(300), added);
ft1.setFromValue(1.0);
ft1.setToValue(0.0);
ft1.play();
ft1.setOnFinished((e) -> {

if (owner.getChildren().contains(added))
owner.getChildren().remove(added);
});

});

}
}, 1000);
}

JDK 分析器: enter image description here

是因为我使用的是静态方法还是应该自己销毁?

最佳答案

实际上,您在这里对定时器终止没有任何问题。您在探查器中看到的线程已经终止——它们的左侧有一个白框,表明它们已死。

探查器显示在程序执行期间创建的所有线程,即使这些线程已经死亡并被垃圾收集。

您可以通过执行以下操作轻松确认:创建 TimerTask 的子类而不是 lambda,它将执行相同的操作并将其 finalize() 方法重新定义为打印一些东西。您会看到,当执行垃圾回收时,您的任务就完成了。它只有在线程停止时才会发生,因为它是 Thread 类中唯一会丢弃对其 Runnable 的引用的地方(TimerTask实现)。

另一种确认方法是从表格顶部的“ View ”下拉列表中选择“实时线程”。

此外,我建议您用 Timer 代替更好的东西。每次需要延迟某个任务时都创建一个线程太浪费了。看看 ScheduledThreadPoolExecutor,它似乎更适合您的任务:

// Create a shared executor with a single thread
private final ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(1);

// Instead of creating a Timer, schedule the task
executor.schedule(() -> {
// Do what you need here
}, 1, TimeUnit.SECONDS);

// Don't forget to terminate the scheduler when you don't need it anymore
scheduler.terminate();

如果您同时有太多计划任务并且这些任务不够小,您可以向执行器添加多个线程。

关于Java - 计时器在执行后未被删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39226338/

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