Тестирование потоков на время - PullRequest
2 голосов
/ 29 апреля 2010

Я создаю поток для своего приложения, которое будет выполнять операцию выхода в указанное время (только часы и минуты, день / месяц не имеет значения) Это правильный способ сделать это, а также правильный тест на время? Кстати, я проверяю 24-часовые часы, а не AM / PM.

Я тогда в другом классе буду называть это что-то вроде новый поток (новый ExitThread ()). start ();

public class ExitThread implements Runnable {



public long getDate() {
    Date thisdate = new Date(System.currentTimeMillis());
    return thisdate.getTime();
}


public long exitDate() {
    Date exitdate = new Date(System.currentTimeMillis());
    exitdate.setHours(23);
    exitdate.setMinutes(30);
    exitdate.setSeconds(0);

    return exitdate.getTime();
}

public long sleepTime() {
    Calendar cal = Calendar.getInstance();
    long now = cal.getTime().getTime();

    cal.set(Calendar.HOUR_OF_DAY, 23);
    cal.set(Calendar.MINUTE, 30);
    cal.set(Calendar.SECOND, 0);
    cal.set(Calendar.MILLISECOND, 0);

    long endMillis = cal.getTime().getTime();
    long timeToSleep = endMillis - now;

    return timeToSleep;
}

@Override
public void run() {

    while (true) {
        try {
            Thread.sleep(sleepTime());
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        if (getDate() >= exitDate()) {
            // System exit method here
        }
    }
}

}

Ответы [ 3 ]

1 голос
/ 29 апреля 2010

Возможно, вы захотите пересчитать currentTime в цикле while: -)

Вместо 10 секунд ожидания перед проверкой состояния конца, вы можете определить миллис, которые соответствуютдо вашего конечного времени и дождитесь количества миллисекунд между текущим и конечным временем.

Если ваше конечное время будет между 235950 и 235959, вы рискуете пропустить его.* update

Вы можете определить число миллисекунд ожидания следующим образом:

Calendar cal = Calendar.getInstance();
long now = cal.getTime().getTime();

cal.set(Calendar.HOUR_OF_DAY,   23);
cal.set(Calendar.MINUTE,        30);
cal.set(Calendar.SECOND,        0);
cal.set(Calendar.MILLISECOND,   0);

long endMillis = cal.getTime().getTime();
long timeToSleep = endMillis - now;

Обратите внимание, что вам нужно вычислить это также в цикле while, потому что сон можетбыть прерванным на следующей итерации потребуется меньше timeToSleep.

1 голос
/ 29 апреля 2010

Для тестируемости вы должны ввести две вещи: «спящий» и «часы». Они могут быть в том же интерфейсе, если хотите, или отдельно. Производственная реализация будет просто использовать Thread.sleep и System.currentTimeMillis, но это означает, что вы также можете создавать поддельные реализации, которые делают код тестируемым.

0 голосов
/ 29 апреля 2010

Возможно, вам следует рассмотреть возможность использования Таймера

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...