更新:我也发现了其他线程的问题;他们进入 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, theWorker
will temporarily enter theSCHEDULED
state before entering theRUNNING
state. That is, the transition is always fromREADY
toSCHEDULED
toRUNNING
(unless of course the Worker in cancelled).
如果由于某种原因你的工作停留在 SCHEDULED
状态,很可能 cancel
和 restart
只是将它返回到相同的状态卡住状态。
此外,(没有看到你的代码的其余部分,所以这只是推断)当你发现它运行时假设它挂起而中断它的想法似乎不稳定,因为它可能运行良好但花费的时间比预期的,或者它可能会在您每次调用它时挂起。如果没有测试,您可以在 connectService
中运行以确定它是否挂起,那么我猜您遇到了类似这样的问题,但感觉有问题。
关于multithreading - 为什么工作线程从 CANCELED 过渡到 SCHEDULED 并跳过 READY? (JavaFX2),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15976781/