为什么工作线程从CANCELED转换为SCHEDULED跳过READY? (JavaFX2)

时间:2013-04-12 16:47:40

标签: multithreading javafx-2

更新:我也发现了其他线程的问题;它们进入计划状态但从不转换为正在运行。为什么吗

我的程序有一个服务,它使用任务通过串口连接到设备。 换句话说,

public class ConnectService extends Service<String> {
   protected Task createTask() {
        return new ConnectTask();
    }

    class ConnectTask extends Task<ObservableList<String>> {
        @Override
        protected ObservableList<String> call() throws Exception {
            ...
            connect();
            ...
        }
    }
}

如果以前的连接到设备的呼叫挂起,那么我想取消任务/线程,并在此尝试中重新开始。 为此,

    if (connectService.getState() != Worker.State.READY) {
        connectService.cancel();
    }
    connectService.restart();

但是在调试器中我发现如果状态是SCHEDULED,那么上面的代码将它发送到CANCELED。但是restart()不会将它发送到READY - 而是返回到SCHEDULED - 并且 call()不会被执行!

这似乎与文档here

相矛盾
  

可重复使用的工作人员将从CANCELED,SUCCEEDED或FAILED过渡   回到现实。

我试过

   if (connectService.getState() != Worker.State.READY) {
        connectService.cancel();
        connectService.reset();
    }
    connectService.start();

现在状态回到READY,但是call()永远不会被执行!

1 个答案:

答案 0 :(得分:1)

您需要将Worker.State.SCHEDULED添加到if条件中排除的状态,即

if (connectService.getState() != Worker.State.READY && 
    connectService.getState() != Worker.State.SCHEDULED) {

    connectService.cancel();
}
connectService.restart();

这是因为Worker 始终会在READY进入SCHEDULED之前从RUNNING过渡到Worker。来自docs

  

然而,即使在立即执行Worker的情况下,也是如此   在进入之前,SCHEDULED会暂时进入RUNNING州   READY州。也就是说,转换总是从SCHEDULED到。{   RUNNINGSCHEDULED(当然除非工人被取消)。

如果由于某种原因您的工作陷入cancel状态,则restartconnectService可能会将其恢复到相同的卡住状态。

另外,(没有看到你的其余代码,所以这只是推断)当你在假设它被挂起的情况下运行它时打断它的想法似乎不稳定,因为它可能运行良好但需要更长的时间预期,或者每次打电话都可能挂起。如果没有测试你可以在{{1}}内运行以确定它是否挂起,那么我猜你会遇到类似这样的事情,但感觉有问题。