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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了当DataInputStream处于while循环时,JavaFX GUI卡住了相关的知识,希望对你有一定的参考价值。

我一直想弄明白一段时间,

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

GUI类中的while循环冻结,但只是在它尝试读取时:

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
");
    }
}

这个类是Controller.class - 如果它有任何区别。

在社区的大量帮助之后,我在stackoverflow中的第一个问题。

提前致谢

答案

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

您正在FX应用程序线程上运行整个循环(使用Platform.runLater())。因此,您阻止该线程并阻止它重新绘制。您应该只在FX应用程序线程上运行UI更新:

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

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

以上是关于当DataInputStream处于while循环时,JavaFX GUI卡住了的主要内容,如果未能解决你的问题,请参考以下文章

主应用程序处于 while 循环时,boost 线程未运行

7.2 while 循环简介

JavaScript:while循环中的异步方法

shell while循环与until循环

怎么跳出while循环

python入门—认识while循环及运用