У меня есть пользовательский интерфейс javafx, который имитирует светофор.У меня есть три нити для каждого из источников света, которые освещают каждый из соответствующих источников света, одновременно выключая остальные.Я запускаю потоки и использую метод join (), чтобы каждый поток мог загореться до того, как начнется другой поток.
Когда я использую Thread.join (), пользовательский интерфейс зависает, но я знаю, что потоки работают должным образом, потому что тестовая строка, которую я поместил в потоки, выполняется и ждет соответствующего времени, прежде чем будет выполнен другой.
Код выглядит следующим образом -
основной метод
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();
}
catch(Exception e){
}
threadYellow = new Thread(lightYellow);
threadYellow.start();
try{
threadYellow.join();
}
catch(Exception e){
}
threadRed = new Thread(lightRed);
threadRed.start();
try{
threadRed.join();
}
catch(Exception e){
}
}
}
классы потоков -
class LightGreen implements Runnable {
@Override
public void run() {
lock.lock();
System.out.println("GREEn");
circleGreen.setFill( Color.GREEN );
circleYellow.setFill( Color.WHITE );
circleRed.setFill( Color.WHITE );
lock.unlock();
try {
Thread.sleep(3000L);
} catch (InterruptedException ex) {
}
}
}
class LightYellow implements Runnable {
@Override
public void run() {
lock.lock();
System.out.println("YELLOW");
circleGreen.setFill( Color.WHITE );
circleYellow.setFill( Color.YELLOW );
circleRed.setFill( Color.WHITE );
lock.unlock();
try {
Thread.sleep(3000L);
} catch (InterruptedException ex) {
}
}
}
class LightRed implements Runnable {
@Override
public void run() {
lock.lock();
System.out.println("RED");
circleGreen.setFill( Color.WHITE );
circleYellow.setFill( Color.WHITE );
circleRed.setFill( Color.RED );
lock.unlock();
try {
Thread.sleep(3000L);
} catch (InterruptedException ex) {
}
}
}
Как я могу решить эту проблему?Мне сказали, что Platform.runlater можно использовать, но я не уверен, как его использовать.Мне нужно использовать многопоточность для этой задачи.