我有一个模拟交通灯的 javafx UI。我为每个灯设置了三个线程,它们点亮了各自的灯,同时关闭了其他灯。我启动线程并使用 join() 以便每个线程可以在另一个线程启动之前点亮各自的灯。
当我使用 Thread.join() 时,UI 会冻结,但我知道线程正在正常运行,因为我放入线程中的测试字符串会执行并在另一个线程执行之前等待适当的时间。
代码如下——
主要方法
public void start(Stage primaryStage) {
lightBoard.setArcWidth(10);
lightBoard.setArcHeight(10);
lightBoard.setFill(Color.DARKGREY);
circleGreen.setFill(Color.WHITE);
circleYellow.setFill(Color.WHITE);
circleRed.setFill(Color.WHITE);
Group group = new Group();
group.getChildren().addAll(lightBoard, circleGreen, circleYellow, circleRed);
BorderPane light = new BorderPane(group);
light.setPadding( new Insets(20, 20, 20, 20) );
GridPane layoutControls = new GridPane();
layoutControls.setAlignment(Pos.CENTER);
Button btnStart = new Button("Start");
Button btnStop = new Button("Stop");
layoutControls.add(btnStart, 0, 0);
layoutControls.add(btnStop, 1, 0);
BorderPane root = new BorderPane();
root.setCenter(light);
root.setBottom(layoutControls);
Scene scene = new Scene(root, 380, 250);
primaryStage.setTitle("Traffic Light Simulator");
primaryStage.setScene(scene);
primaryStage.show();
// create and start threads
Runnable lightGreen = new LightGreen();
Runnable lightYellow = new LightYellow();
Runnable lightRed = new LightRed();
Thread threadGreen = new Thread(lightGreen);
Thread threadYellow = new Thread(lightYellow);
Thread threadRed = new Thread(lightRed);
while(true){
threadGreen = new Thread(lightGreen);
threadGreen.start();
try{
threadGreen.join();
}
我该如何解决这个问题?有人告诉我 Platform.runlater 可以使用,但不确定如何使用它。我需要为此任务使用多线程。
相关分类