我正在尝试使用
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
的内容。这是正常行为吗?
如果是这种情况,那么您应该提交错误报告,因为您描述的行为直接与Worker.State
javadoc中指定的行为相矛盾。
Worker 可能会在 READY、SCHEDULED 或 RUNNING 时被取消,在这种情况下,最终状态将被取消。当 Worker 在其中一种情况下被取消时,它将立即转换为 CANCELLED 状态。
我的任务可能存在并发问题吗?我希望有人回答有关您代码中潜在问题的问题,您需要编辑您的问题以提供
MCVE。
是否有任何来源概述了 cancel() 失败的原因?
javafx-src.zip 包含在 Oracle Java 8 JRE 中,您可以研究源代码以确定其行为的一些原因。
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);
} }