当 DataInputStream 处于 while 循环时,JavaFX GUI 卡住了

JavaFX GUI stuck when DataInputStream is in while loop

我已经想了一段时间了,

我正在尝试编写一个聊天服务器应用程序,仅供学习。 我有一个我无法理解的障碍,

GUI 内部的 while 循环 class 冻结,但就在它尝试读取时:

public void run(){
    Platform.runLater(() -> {
        do {
            try {
                msg = getFromServer.readUTF(); // <--- freeze GUI
                chatWindow.appendText(msg);
            } catch (IOException e) {
                e.printStackTrace();
            }
        } while (true);
    });
}

你可以看到它在一个线程中 运行,但我确实尝试 运行 它以其他方式...

只有 DataInputStream 卡住了,

msg = getFromServer.readUTF();

这是它来自的方法:

public void connectToServer(){
    try {
        serverConectionState = new Socket("127.0.0.1", 6789);
        getFromServer = new DataInputStream(serverConectionState.getInputStream());
        sendToServer = new DataOutputStream(serverConectionState.getOutputStream());
        onlineOffline.setText("Online");
        onlineOffline.setTextFill(javafx.scene.paint.Color.web("#0076a3"));
    } catch (IOException ex){
        chatWindow.appendText("server connection fail\n");
    }
}

这个 class 是 Controller.class - 如果有什么不同的话。

在社区的大量帮助下,我在 Whosebug 中的第一个问题。

提前致谢

我假设您展示的 run 方法是在后台线程中执行的 Runnable 的一部分。

您正在 运行 FX 应用程序线程上的整个循环(通过使用 Platform.runLater())。所以你阻塞了那个线程并阻止它重新绘制。您应该 运行 仅 UI 外汇应用程序线程上的更新:

public void run(){
    do {
        try {
            String msg = getFromServer.readUTF(); // <--- freeze GUI
            Platform.runLater(() -> chatWindow.appendText(msg));
        } catch (IOException e) {
            e.printStackTrace();
        }
    } while (true);
}

你应该使用 java task 而不是 platform.runlater,这样你就可以 运行 不同线程中的代码,而不会冻结 UI线程