Я не могу комментировать ваш вопрос, потому что у меня нет 50 баллов, поэтому мне придется написать ответ с вопросом здесь.
Вы говорите, что приведенный выше код не работает. Что именно не работает? Каковы симптомы и что вы ожидаете?
Одна из проблем заключается в том, что вы выполняете итерацию только за считанные секунды, полностью игнорируя минуты и часы. Другой заключается в том, что вы создаете поток, который не используется вообще. Третий заключается в том, что вы вызываете Thread.sleep(1000)
внутри цикла for, но я не уверен, знаете ли вы, что он полностью заблокирует Thread, пока он не будет завершен.
Во-первых, цикл должен начинаться с:
for (int a = hours * 3600 + 60 * minutes + seconds; a >= 0; a--)
Во-вторых, Thread thread = new Thread();
не используется вообще.
В-третьих, Thread.sleep(1000)
будет блокировать текущую нить до ее завершения.
И, наконец, ваше состояние говорит a <= 0
вместо a >= 0
.
Так один из способов, вы можете скорректировать приведенный выше код:
private void countDownTimer() throws InterruptedException {
int hours = (int) jSpinner1.getValue();
int minutes = (int) jSpinner2.getValue();
int seconds = (int) jSpinner3.getValue();
for (int a = hours * 3600 + 60 * minutes + seconds; a >= 0; a--) {
Thread.sleep(1000);
System.out.println(a);
}
}
}
Это предполагает, что «не работает» означает, что он игнорирует минуты и часы.
Другим решением является создание нового потока с помощью функции обратного вызова, которая будет вызываться после того, как таймер обратного отсчета дойдет до нуля:
public class CountDownRunnable implements Runnable {
private final int hours;
private final int minutes;
private final int seconds;
public CountDownRunnable(int hours, int minutes, int seconds) {
this.hours = hours;
this.minutes = minutes;
this.seconds = seconds;
}
public void run() {
for (int a = hours * 3600 + 60 * minutes + seconds; a >= 0; a--) {
Thread.sleep(1000);
System.out.println(a);
}
// Here goes your code that will be invoked once the timer reaches zero...
}
}
Тогда ваш метод будет выглядеть следующим образом:
private void countDownTimer() throws InterruptedException {
(new Thread(new HelloRunnable())).start();
}
Кто-нибудь может мне помочь, пожалуйста??? –
Может быть, вы можете использовать https://docs.oracle.com/javase/7/docs/api/java/util/Timer.html#scheduleAtFixedRate(java.util.TimerTask,%20long,%20long) –