java - 如何对我现有的 javafx 应用程序进行多线程处理

标签 java multithreading javafx-2 lag

我正在创建一个 javafx 应用程序。它使用一些繁重的编程(繁重的映射)。我需要多线程处理它,因为用户体验变得迟钝。
如果可能的话,我不想重写整个代码。但没有必要。我需要有人来完整解释生命周期,如何控制线程以及如何要求它做某事。
例如,我在我的 fxml Controller 中提供了完整的映射字符列表:

@FXML
private static final Map <Character, String> myMap = new HashMap <> ();
static {
    myMap.put('a', "5");
    myMap.put('b', "6");
    myMap.put('c', "7");
    myMap.put('d', "8");
    //And so on...
}

然后我在按下按钮时对输入文本进行编码:

    String codedTextOut;                
    textToCode = enteredText.getText();
    StringBuilder encoderTextSB = new StringBuilder();
    for (char codeChar : textToCode.toCharArray()) {
        encoderTextSB.append(myMap.get(codeChar));
    }
    codedTextOut = encoderTextSB.toString();

它提供了滞后的用户体验。我想创建一个单独的线程来执行按钮按下时的编码操作。请帮助并解释线程的各种属性。 (我已经查看了 http://docs.oracle.com/javafx/2/threads/jfxpub-threads.htm ,但它提供的信息不多)

最佳答案

  1. 使用预定义的线程池或 new Thread(),您可以在其中提供可运行的数据。

它将计算从 javafx 线程转移到另一个线程,以便用户可以继续与应用程序交互。

  1. 当结果就绪时,使用 runLater() - 此调用将在 javafx 队列上完成,这样您就不会遇到并发问题。

这允许您将评估结果返回到 UI。 (您不应与来自另一个线程的 UI 组件交互)。

可以选择使用 javafx 并发包中的其他功能,例如 Task。

这是一个代码片段:

@Override
public void start(Stage primaryStage) {
    final TextArea ta = new TextArea();
    ta.setMinSize(100, 100);
    Button btn = new Button();
    btn.setText("Encode'");
    btn.setOnAction(new EventHandler<ActionEvent>() {

        @Override
        public void handle(ActionEvent event) {

            ta.setDisable(true);
            new Thread(new Runnable() {

                @Override
                public void run() {
                    final StringBuilder codedTextOut = new StringBuilder();
                    String textToCode = ta.getText();
                    StringBuilder encoderTextSB = new StringBuilder();
                    for (char codeChar : textToCode.toCharArray()) {
                        encoderTextSB.append(codeChar + 15);
                    }
                    codedTextOut.append(encoderTextSB);
                    Platform.runLater(new Runnable() {

                        @Override
                        public void run() {
                            ta.setText(codedTextOut.toString());
                            ta.setDisable(false);
                        }
                    });
                }
            }).start();
        }
    });

    VBox root = new VBox();
    root.getChildren().addAll(ta, btn);

    Scene scene = new Scene(root, 300, 250);

    primaryStage.setTitle("Encoder");
    primaryStage.setScene(scene);
    primaryStage.show();
}

单击按钮时,您禁用文本区域,创建一个新线程,在其中执行代码,之后将 runnable 放入 javafx 队列,并在 JavaFX 线程上执行第二个 runnable 中的一段代码,您可以在其中分配新文本并启用文本区域。

关于java - 如何对我现有的 javafx 应用程序进行多线程处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16880733/

相关文章:

java - 有没有办法在 Java 中传递方法引用?

java - 在没有表单提交的情况下在 Spring 使用ajax jquery上传图像

java - Spring MVC/JSP。如何创建带有国家/地区列表的多语言组合?

c# - 线程意外退出时抛出什么异常?

java - 无法在 WinXP 32 位上为 JavaFX 应用程序构建 native 包

java - Spring MVC 中的 ThrowawayController 如何从请求中获取参数?

c++ - 同一线程上的两个连续 memory_order_release 存储可以相互重新排序吗?

charts - 带有倒 y 轴的图表

java - Stage 的监听器最小化、最大化等

c++ - 调用 moveToThread() 不会将 QObject 移动到另一个线程。