multithreading - 为什么工作线程从 CANCELED 过渡到 SCHEDULED 并跳过 READY? (JavaFX2)

标签 multithreading javafx-2

更新:我也发现了其他线程的问题;他们进入 Scheduled 状态但从不过渡到 Running。为什么?

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

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,则上面的代码会将其发送到 CANCELLED。但是 restart() 不会将其发送到 READY - 而是返回到 SCHEDULED - 并且 call() 不会被执行!

这似乎与文档 here 相矛盾

A reusable Worker will transition from CANCELLED, SUCCEEDED or FAILED back to READY.

我试过了

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

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

最佳答案

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

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

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

这是因为 Worker 在进入 RUNNING 状态。来自docs

However even in cases where the Worker is executed immediately, the Worker will temporarily enter the SCHEDULED state before entering the RUNNING state. That is, the transition is always from READY to SCHEDULED to RUNNING (unless of course the Worker in cancelled).

如果由于某种原因你的工作停留在 SCHEDULED 状态,很可能 cancelrestart 只是将它返回到相同的状态卡住状态。

此外,(没有看到你的代码的其余部分,所以这只是推断)当你发现它运行时假设它挂起而中断它的想法似乎不稳定,因为它可能运行良好但花费的时间比预期的,或者它可能会在您每次调用它时挂起。如果没有测试,您可以在 connectService 中运行以确定它是否挂起,那么我猜您遇到了类似这样的问题,但感觉有问题。

关于multithreading - 为什么工作线程从 CANCELED 过渡到 SCHEDULED 并跳过 READY? (JavaFX2),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15976781/

相关文章:

iphone - 正确使用 Grand Central Dispatch - 启动、挂起、恢复、取消线程?

JavaFX 将按钮从 Controller 获取到另一个类

c++ - 检查当前线程是否为主线程

c++ - 具有独立读取器和写入器线程的单个队列是否需要锁定?

javafx - javaFx 应用程序中的 Bootstrap 样式?

java - 只允许在表格 View 上选择一个复选框

javafx-2 - 你如何让 JavaFX ListView 成为其项目的高度?

JavaFX 场景生成器 : How to uncheck "Resize" option in Layout tab?

java - 阻塞队列取出无序

Java 线程在隐藏到系统托盘时停止