gpt4 book ai didi

multithreading - JavaFX - 取消任务不起作用

转载 作者:行者123 更新时间:2023-12-03 12:45:30 26 4
gpt4 key购买 nike

在 JavaFX 应用程序中,我有一个方法需要很长时间处理大量输入。我在加载时打开一个对话框,我希望用户能够取消/关闭该对话框并且任务将退出。我创建了一个任务并在取消按钮处理中添加了它的取消。但取消不会发生,任务不会停止执行。

Task<Void> task = new Task<Void>() {
@Override
public Void call() throws Exception {
// calling a function that does heavy calculations in another class
};
task.setOnSucceeded(e -> {
startButton.setDisable(false);
});
}
new Thread(task).start();

cancelButton.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent e) {
System.out.println("Button handled");
task.cancel();
}
);

为什么点击按钮后任务没有被取消?

最佳答案

您必须检查取消状态(参见 Task's Javadoc )。看看这个MCVE :

public class Example extends Application {

@Override
public void start(Stage primaryStage) throws Exception {
Task<Void> task = new Task<Void>() {
@Override
protected Void call() throws Exception {
new AnotherClass().doHeavyCalculations(this);
return null;
}
};

Button start = new Button("Start");
start.setOnMouseClicked(event -> new Thread(task).start());

Button cancel = new Button("Cancel");
cancel.setOnMouseClicked(event -> task.cancel());

primaryStage.setScene(new Scene(new HBox(start, cancel)));
primaryStage.show();
}

private class AnotherClass {

public void doHeavyCalculations(Task<Void> task) {
while (true) {
if (task.isCancelled()) {
System.out.println("Canceling...");
break;
} else {
System.out.println("Working...");
}
}
}

}

}

请注意……

  • 你应该使用Task#updateMessage(String)而不是打印到 System.out,这里只是为了演示。
  • 直接注入(inject)Task 对象会产生循环依赖。但是,您可以使用代理或其他适合您情况的东西。

关于multithreading - JavaFX - 取消任务不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44153976/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com