DataInputStream处于while循环中时JavaFX GUI卡住

DataInputStream处于while循环中时JavaFX GUI卡住,java,javafx,connection-string,fxml,Java,Javafx,Connection String,Fxml,我想弄清楚这件事已经有一段时间了 我正试图写一个聊天服务器应用程序,只是为了学习。 我有一个我无法理解的障碍 GUI类内部的while循环冻结,但就在它尝试读取时: public void run(){ Platform.runLater(() -> { do { try { msg = getFromServer.readUTF(); // <--- freeze 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);
    });
}
这就是它的来源:

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");
    }
}
这个类是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);
}
public void run(){
做{
试一试{
字符串msg=getFromServer.readUTF();//chatWindow.appendText(msg));
}捕获(IOE异常){
e、 printStackTrace();
}
}虽然(正确);
}

而不是使用platform.runlater()您应该使用java,这样您就可以在不同的线程中运行代码,而不必冻结UI线程,正如下面的答案所建议的那样,只有当您想更新UI而不在这些线程中执行业务逻辑或数据操作时,您才必须使用
platform.runlater()
。因此,在您的示例中,您应该调用
Runnable
,当Runnable完成作业时,它应该使用
Platform.runLater()更新UI。还要注意,对于大型应用程序,最好使用ExecutorService,而不是在DemandHanks James上生成线程,我知道这是为了更新文本字段,但我的问题是:String msg=getFromServer.readUTF();即使我不添加文本,我仍然有GUI冻结。是的,bdw,在控制器中实现可运行,可以吗?这可能会冻结GUI??您是否在后台线程中运行此程序?也许您可以编辑代码,以显示实际调用的位置。你是说如果你删除聊天窗口。appendText(…)
并完全删除平台。runLater(…),它仍然会阻止GUI?干杯,再次感谢,我更新了代码,如果你能看一下的话-James,James!!非常感谢!!!解决了的!!(:我将阅读更多关于线程的内容..新手!!谢谢Sijo!我的问题是我添加了iThread.run()而不是iThread.start(),但我很确定这也可以用你的解决方案解决。
public void run(){
    do {
        try {
            String msg = getFromServer.readUTF(); // <--- freeze GUI
            Platform.runLater(() -> chatWindow.appendText(msg));
        } catch (IOException e) {
            e.printStackTrace();
        }
    } while (true);
}