Хотя вы хотите изменить цвет каждой кнопки на 1 секунду, ваша основная нить слишком быстрая и заканчивается в течение этой секунды.Вот почему кажется, что все источники света изменяются одновременно.
Простое решение состоит в том, чтобы также заставить внешний поток спать некоторое время, но это не гарантирует последовательность потоков.Я бы предложил использовать java.util.concurrent.CountDownLatch
, чтобы внешняя нить ожидала завершения внутренней нити.
for (int i = 0; i < round; i++) {
CountDownLatch countDownLatch = new CountDownLatch(1);
// red is the position in the array
if (colours[i] == 1) {
Thread sleep = new Thread(new Worker(redButton, Color.RED, countDownLatch))
sleep.start();
}
// yellow
else if (colours[i] == 2) {
Thread sleep = new Thread(new Worker(yellowButton, Color.YELLOW, countDownLatch))
sleep.start();
}
// green
else if (colours[i] == 3) {
Thread sleep = new Thread(new Worker(greenButton, Color.GREEN, countDownLatch))
sleep.start();
}
// blue
else if (colours[i] == 4) {
Thread sleep = new Thread(new Worker(blueButton, Color.CYAN, countDownLatch))
sleep.start();
}
countDownLatch.await();
}
}
class Worker implements Runnable {
Button button;
Color color;
CountDownLatch countDownLatch;
public Worker(Button button, Color color, CountDownLatch countDownLatch) {
this.button = button;
this.color = color;
this.countDownLatch = countDownLatch;
}
@Override
public void run() {
button.setBackground(Color.WHITE);
button.setOpaque(true);
try {
Thread.currentThread().sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
button.setBackground(color);
button.setOpaque(false);
countDownLatch.countDown();
}
}
Как только индикатор меняет цвет на 1 секунду, вы начинаете обратный отсчет с помощью countDownLatch.countDown()
, и вы ждете, пока обратный отсчет не достигнет нуля с countDownLatch.await()
во внешней нити.