Метод Platform.runLater () - PullRequest
       8

Метод Platform.runLater ()

0 голосов
/ 06 мая 2019

Я пытаюсь понять, вызывает ли метод Platform.runLater () только ЖЕ JavaFxApplicationThread, как в методе start (), или ДРУГОЙ, ПАРАЛЛЕЛЬНЫЙ поток с тем же именем?

В приведенном ниже коде:

1) сначала, start () - метод был вызван с JavaFxApplicationThread;

2) затем, startFilling () - метод был вызван, где начинается новый поток;

3) наконец, новая сцена была открыта с помощью метода openMessage (), где использовался метод Platform.runLater ().

Пожалуйста, смотрите код:

public class FillingTimeLine extends Application {
private LongProperty lp = new SimpleLongProperty(0);
private Timeline timeline = new Timeline();

@Override
public void start(Stage primaryStage) throws Exception {
    // TODO Auto-generated method stub
    System.out.println("\nSTARTING THREAD: " + Thread.currentThread().getName());
    StackPane spane = new StackPane();
    ProgressBar pb = new ProgressBar(0);
    pb.setMinSize(160, 21.5);
    pb.setMaxSize(160, 21.5);
    pb.setPrefSize(160, 21.5);

    pb.progressProperty().bind(lp.divide(10000 * 1.0));
    pb.setStyle("-fx-base:darkgray;-fx-accent:red;");
    spane.getChildren().add(pb);
    Scene scene = new Scene(spane, 300, 300);
    primaryStage.setScene(scene);
    primaryStage.show();
    startFilling();
    openNewStage();

}

public void startFilling() throws InterruptedException {
    new Thread(() -> {
        System.out.println("\nSTARTING THREAD: " + Thread.currentThread().getName());
        timeline = new Timeline(new KeyFrame(Duration.seconds(0), new KeyValue(lp, 0)),
                new KeyFrame(Duration.seconds(20), new KeyValue(lp, 20000)));
        if (Thread.currentThread().isInterrupted()) {
            System.out.println("\n THR WAS INTERRUPTED!");
            return;
        }

        timeline.play();
        try {
            Thread.sleep(20000);
        } catch (InterruptedException ex) {
            System.out.println("\n THR WAS INTERRUPTED!");
            return;
        }

    }).start();

}

public void stopFilling() {
    new Thread(() -> {
        System.out.println("\nSTOPPING THREAD: " + Thread.currentThread().getName());
        timeline.stop();

    }).start();
}

public void openNewStage() {
    Platform.runLater(() -> {

        System.out.println("\nOPENNING THREAD" + Thread.currentThread().getName());
        Stage qst = new Stage();
        StackPane sp = new StackPane();
        Button btn = new Button("STOP");

        btn.setMaxHeight(25);
        btn.setMinHeight(25);
        btn.setPrefHeight(25);
        btn.setMaxWidth(80);
        btn.setMinWidth(80);
        btn.setPrefWidth(80);

        btn.setAlignment(Pos.CENTER);

        btn.setOnAction(e -> {
            try {
                qst.close();
                stopFilling();
            } catch (Exception e1) {
                return;
            }
        });

        sp.getChildren().add(btn);
        Scene scene = new Scene(sp, 200, 120);
        qst.setX(50);
        qst.setY(50);
        qst.setScene(scene);
        qst.setResizable(false);
        qst.show();
    });
}

public static void main(String[] args) {
    launch(args);
}

}

I thougt Platform.runLater () разрешает параллельное выполнение.И я ожидал, что новый этап с кнопкой STOP будет открыт другим потоком, потому что JavaFxApplicationThread все еще был занят с primaryStage.

Но CONSOLE PUTPUT показывает, что новый этап был открыт также с помощью JavaFxApplicationThread - так же, как primaryStage:

НАЧАЛЬНАЯ РЕЗЬБА: Поток приложения JavaFX

НАЧАЛЬНАЯ РЕЗЬБА: Поток-3

РЕЗЬБА ОТПРАВЛЯЮЩАЯ: Поток приложения JavaFX

ОТКЛЮЧЕНИЕ РЕЗЬБЫ: Поток-4

Итак, как один и тот же поток может открыть новую стадию, если primaryStage все еще показывает и не закрыт?

Или OPENING THREAD - другой параллельный поток с тем же именем?

Заранее спасибо

...