JavaFX2:我可以暂停后台任务/服务吗?

时间:2013-02-18 16:40:50

标签: multithreading service concurrency javafx-2 task

我正在尝试设置一个后台服务,该服务将从csv文件执行批量加载事务数据。此后台服务将从映射到控制器/演示者类中的方法的菜单项操作启动。

通常,csv文件中的某些数据会在数据库中找不到主数据,这通常会导致上传阻塞并失败。

在这种情况下,我希望能够让后台服务暂停其处理并从演示者类调用对话框以接收用户输入。用户输入将用于在数据库中添加主行,之后后台服务应从其停止的位置恢复(不是从csv文件的开头,而是从导致错误的行)。

这可能在JavaFX中实现,也许使用javafx.concurrent API?我该怎么做呢?

1 个答案:

答案 0 :(得分:22)

解决方案

当您的后台进程遇到需要提示用户输入的情况时,请使用FutureTask中的Platform.runLater执行showAndWait JavaFX应用程序线程上的对话框提示。在后台进程中使用futureTask.get暂停后台进程,直到用户输入必要的值,这将允许进程继续。


示例代码段

以下是此方法的代码的本质,它可以放在后台进程的调用方法中:

String nextText = readLineFromSource();
if ("MISSING".equals(nextText)) {
  updateMessage("Prompting for missing text");
  FutureTask<String> futureTask = new FutureTask(
    new MissingTextPrompt()
  );
  Platform.runLater(futureTask);
  nextText = futureTask.get();
}
...
class MissingTextPrompt implements Callable<String> {
  private TextField textField;

  @Override public String call() throws Exception {
    final Stage dialog = new Stage();
    dialog.setScene(createDialogScene());
    dialog.showAndWait();
    return textField.getText();
  }
  ...
}

示例应用

我创建了a small, complete sample application来演示这种方法。

示例应用程序的输出是:

promptingtaskdemooutput

示例输出说明

读取的没有缺失值的行只是纯棕色。 输入提示值的行具有淡绿色背景。 已经读取了14行,后台任务已经在第6行暂停了一次,该行丢失了一个值。系统提示用户输入缺失值(用户输入xyzzy),然后该过程一直持续到第14行也丢失,后台任务再次暂停,并显示另一个提示对话框。