在 SCHEDULED 状态下取消 JavaFX 服务

问题描述 投票:0回答:2

我正在尝试使用

Service
方法取消我的 JavaFX
cancel()
。 在调用
cancel()
之前,我会检查
Worker
状态。

System.out.println(service.getState());

System.out.println(service.cancel());

cancel()
处于
Worker
状态时,
SCHEDULED
方法持续失败。
cancel()
返回 false,并且
Worker
进入
RUNNUNG
状态,然后作为
SUCCEEDED
终止。

我在文档中找不到任何关于

cancel()
不影响
SCHEDULED
Worker
的内容。这是正常行为吗?

javafx java.util.concurrent
2个回答
0
投票

如果是这种情况,那么您应该提交错误报告,因为您描述的行为直接与Worker.State

javadoc
中指定的行为相矛盾。

Worker 可能会在 READY、SCHEDULED 或 RUNNING 时被取消,在这种情况下,最终状态将被取消。当 Worker 在其中一种情况下被取消时,它将立即转换为 CANCELLED 状态。


我的任务可能存在并发问题吗?

我希望有人回答有关您代码中潜在问题的问题,您需要编辑您的问题以提供

MCVE

是否有任何来源概述了 cancel() 失败的原因?

javafx-src.zip 包含在 Oracle Java 8 JRE 中,您可以研究源代码以确定其行为的一些原因。


0
投票
如果您尝试将其用于 ScheduledService 对象,请尝试使用 Platform.runLater(super::cancel),例如:

public class ListenerService extends ScheduledService<Integer> { private int errorCounter = 0; private int maxExceptionsCount = 3; ListenerService() { super(); setOnFailed(event -> { errorCounter += 1; if (errorCounter >= maxExceptionsCount) { Platform.runLater(super::cancel); logger.trace("Listener service force cancel by max error counter"); errorCounter = 0; } }); } @Override protected Task<Integer> createTask() { return new ListenerTask(printerService); } }
    
© www.soinside.com 2019 - 2024. All rights reserved.