Функция контроллера вызова javafx из другого потока

Вопрос дня: как вызвать функцию контроллеров из другого потока. Мое приложение выглядит так:

public class Server {
//(...)
    public String setMsg(String string) {
       msg.set(string+"\n");
       mainScreenController.updateLog();
    }
//(...)
   while (true){
   doThings();
   }
}

    public class MainScreenController {
//(...)
    public void startServer(){
    new Thread(server::start).start();
    }
     public void updateLog(){
            Platform.runLater(()->{ testAreaLog.setText(testAreaLog.getText() + server.getMsg()); });
        }
//(...)
    }

Я хочу позвонить updateLog() в блоке finally, поэтому каждый раз сервер обновляет msg GUI добавляет это сообщение в окно журнала. мой msg является

private volatile AtomicReference<String> msg = new AtomicReference<String>();

это работает, когда я звоню updateLog(); в startServer(), отображает первое сообщение Starting server как вы уже догадались, но зовет другого updateLog(); туда возвращается null поэтому я хотел позвонить сразу после getMsg() используется.

1 ответ

Решение

Не совсем понятно, почему ты не можешь просто сделать

public class MainScreenController {
    //(...)

    public void startServer(){
        new Thread(server::start).start();
    }

    public void updateLog(String message){
        Platform.runLater(()-> testAreaLog.appendText(message + "\n"));
    }

    //(...)
}

а также

public class Server {

   public void start() {
       while (true){
           doThings();
           String newMessage = ... ;
           mainScreenController.updateLog(newMessage);
           doMoreThings();
       }
   }

}

Это предполагает что-то в вашем while цикл является блокирующим (или трудоемким) вызовом, поэтому вы не переполняете поток пользовательского интерфейса слишком большим количеством Platform.runLater() звонки.

Другие вопросы по тегам