Concurrency 活动日志在JavaFX中未得到持续更新

Concurrency 活动日志在JavaFX中未得到持续更新,concurrency,javafx-2,Concurrency,Javafx 2,我正在linux上使用JSCH执行一些命令,并获取该命令的输出,并将其打印到JAVAFX应用程序的活动日志中 这里有一个问题:活动日志区域在打印一些行后被卡住。但是,如果我从窗口切换回来,应用程序将继续在日志区域打印行。我已经调试了好几次,但都没有发现问题 下面是代码 channel.connect(); PrintStream commander = new PrintStream(channel.getOutputStream(), true); commander.println(com

我正在linux上使用JSCH执行一些命令,并获取该命令的输出,并将其打印到JAVAFX应用程序的活动日志中

这里有一个问题:活动日志区域在打印一些行后被卡住。但是,如果我从窗口切换回来,应用程序将继续在日志区域打印行。我已经调试了好几次,但都没有发现问题

下面是代码

channel.connect();

PrintStream commander = new PrintStream(channel.getOutputStream(), true);
commander.println(command_cd);
commander.println(" exit;");
commander.close();


InputStream outputstream_from_the_channel = channel.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(outputstream_from_the_channel));
String jarOutput;
BufferedWriter bw = new BufferedWriter(new FileWriter(resultLogFile.getAbsolutePath(), true));
while ((jarOutput = reader.readLine()) != null) {
    this.logger.info("Status Update = " + jarOutput);
    System.out.print("Status Update on screen ="+jarOutput + "\n");
    bw.write(jarOutput);
    bw.newLine();
    outputFromUnix.append(jarOutput).append("\n");

    // Display in activity log area in realtime.
    if (DeploymentTaskController.actLogTArea != null) {
        System.out.println("outputFromUnix.toString()---->>>>> " + outputFromUnix.toString());

    //actlogArea is TextArea

        DeploymentTaskController.actLogTArea.setText(outputFromUnix.toString());
        DeploymentTaskController.actLogTArea.end();

    }
}
bw.close();

reader.close();

JavaFX有一个名为“JavaFX应用程序线程”的特殊线程来更新所有UI。此线程不应用于任何非UI操作,所有UI操作必须在该线程上运行

确保在单独的线程中运行代码,并将所有UI代码包装到
Platform#runLater()
中执行

// Using separate thread to run data loading code
new Thread(new Runnable() {
    public void run() {
        channel.connect();

        // [...] all your channel reading code

        // Updating UI from JavaFX Application Thread
        if (DeploymentTaskController.actLogTArea != null) {
            System.out.println("outputFromUnix.toString()---->>>>> " + outputFromUnix.toString());

            final String outputStr = outputFromUnix.toString();
            Platform.runLater(new Runnable() {
                @Override
                public void run() {
                    DeploymentTaskController.actLogTArea.setText(outputStr);
                    DeploymentTaskController.actLogTArea.end();
                }
            });
        }
        bw.close();
        reader.close();
    }
}).start();

JavaFX中还有一个特殊的并发API用于此类任务,请参见此处:

非常感谢Sergey!!