Я пытаюсь понять, вызывает ли метод 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 - другой параллельный поток с тем же именем?
Заранее спасибо