我正在创建一个 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 ,但它提供的信息不多)
最佳答案
- 使用预定义的线程池或 new Thread(),您可以在其中提供可运行的数据。
它将计算从 javafx 线程转移到另一个线程,以便用户可以继续与应用程序交互。
- 当结果就绪时,使用 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/