如何调用实时日志模拟器,该模拟器可从多个线程获取信息

时间:2019-03-31 07:04:49

标签: java multithreading logging javafx concurrency

我完全知道已经有人问过这个问题,但是我的问题在于如何调用该特定函数。 因此,让我介绍一个主要问题:我必须创建一个日志以将客户添加到队列中。

为了解决这个问题,我尝试了具有可运行对象和Platform.runLater(...)的方法的多个版本,但是它仅在过程完成后才更新日志。由于这些方法已经为其他人使用,因此我开始认为我在错误地使用它们。这是我写的:

这是我声明UI的地方,我在其中使用了

import javafx.application.Application;
import javafx.application.Platform;
import javafx.scene.Scene;
import javafx.scene.control.TextArea;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) {
        Scheduler.border.setCenter(Scheduler.scroll);
        Scene scene = new Scene(Scheduler.border, 800, 600);
        primaryStage.setScene(scene);
        primaryStage.show();
        Scheduler scheduler = new Scheduler();
        scheduler.run();
    }
    public static void main(String[] args) {
        launch(args);
    }
}

可运行类。它每秒钟在控制台中显示一次,并在10秒后显示gui。第二种方法是应该解决我的问题的方法:制作FX线程以允许我更改UI。确实如此,但是在错误的时间。

class Scheduler implements Runnable{

    private static final int numberQueues = 3;
    static final int serviceTime = 10;
    static volatile int currentTime;
    public static BorderPane border = new BorderPane();
    public static Pane scroll = new Pane();
    public static TextArea logList = new TextArea(" Starting Logs...\n");

    public Scheduler() {currentTime = 0;}

    @Override
    public void run() {
        while (serviceTime > currentTime) {
            currentTime += 1;
            try {
                writeToActivityLog(currentTime + " | Customer at queue" + currentTime % numberQueues);
                System.out.println(currentTime + " | Customer at queue" + currentTime % numberQueues);
                Thread.sleep(1000);

            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
        static public void writeToActivityLog(String logEntry){

        class Threade implements Runnable {
            private String logEntry;

            private Threade(String logEntry){
                this.logEntry = logEntry;
            }

            @Override
            public void run() {
                logList.appendText(logEntry);
                scroll.getChildren().removeAll();
                scroll.getChildren().addAll(logList);
            }
        }
        String updatedLog = logList.getText()+ logEntry;
        Threade thread = new Threade(updatedLog);
        Platform.runLater(thread);
    }
}

因此,如前所述,我希望不仅在线程完成之后,还可以在线程运行时生成日志。但这是我可以获得它们的唯一方法。另外,该窗口会冻结在线程过程中单击的窗口,但是在线程完成运行之后就可以了。

0 个答案:

没有答案