В ожидании конкретной даты. Календарь Java Code Optimization - PullRequest
3 голосов
/ 21 июля 2011

Я хочу выполнить задачу, используя Java в определенный час .Мой код работает, но выглядит не очень хорошо.Я сравниваю две строки.Я пытался сравнить даты, используя getTimeInMills (), но цифры не совпадают.

Вот мой код:

import java.util.Calendar;

class Voter {
Calendar current,deadline;
boolean keepGoing = true;

public static void main(String[] args) {
    Voter strzal = new Voter();
    strzal.shoot();
}

public void shoot() {
    deadline = Calendar.getInstance();
    deadline.set(2011,6,21,11,20,00);

    while (keepGoing) {
        // wait 1 second
        try {
            Thread.sleep(1000);
            System.out.print(".");
        } catch (InterruptedException ex) { ex.printStackTrace(); }

        current = Calendar.getInstance();

        if (deadline.getTime().toString().equals(current.getTime().toString())) {
            System.out.println("Got it!");
            keepGoing = false;
        } // end of if
    } // end of while
} // end of shoot() method

}

Я работаю в цикле, ожидая, что текущее время будет равно крайнему сроку (в примере я установил его на 21 июля 2011 г. 11:10).

Как я могу улучшить свой код? Я быМне нравится использовать, например, метод compareTo () или getTimeInMills () из класса Calendar, но я не могу правильно установить крайний срок.

Заранее спасибо.

Ответы [ 3 ]

4 голосов
/ 21 июля 2011

Используйте ScheduledExecutorService , чтобы управлять этим для вас, вместо того, чтобы спать и ждать подходящего времени. Метод schedule звучит так, как будто он сделает то, что вам нужно.

3 голосов
/ 21 июля 2011

Использование ScheduledExecutorService является лучшим предложением, однако для вашего знания

Calendar deadline = Calendar.getInstance();
deadline.set(2011,6,21,11,20,00);
long endTime = deadline.getTime().getTime();

// later
long current = System.currentTimeMillis();
if (current >= endTime) {
    System.out.println("Got it!");
    break;
}
2 голосов
/ 21 июля 2011

Не изобретай велосипед!Для этого есть класс JDK - ScheduledThreadPoolExecutor .Вот одна строка кода, которая делает все это:

new ScheduledThreadPoolExecutor(1).schedule(new Runnable() {
    public void run() {
        // Do something
    }
}, 1, TimeUnit.HOURS);

Этот пример ждет 1 час, но вы можете заменить его на столько секунд или сколько вам нужно.

Работа выполнена.

...