Как запланировать задачу в реальном времени с абсолютным временем запуска?

Когда вы реализуете интерфейс java.io.Serializable для создания сериализуемого класса, компилятор ищет статическое конечное поле с именем «serialVersionUID» типа long. Если класс не указал это поле явно, то компилятор создаст одно такое поле и присвоит ему значение, которое выходит из зависимого от реализации вычисления serialVersionUID. Это вычисление зависит от различных аспектов класса, и оно следует за спецификациями сериализации объектов, данными Sun. Но значение не гарантируется во всех реализациях компилятора.

Это значение используется для проверки совместимости классов в отношении сериализации, и это выполняется при де-сериализации сохраненного объекта. Последовательность выполнения Serialization проверяет, что serialVersionUID класса отправителя (который использовался для сохранения состояния объекта в потоке) и класса получателя (класс, который используется для восстановления объекта, возможно, в какой-либо другой системе) оба они точно такие же. Если система приемника загрузила класс с некоторым другим идентификатором serialVersionUID, чем класс, используемый в процессе сериализации, мы получаем InvalidClassException.

ПРИМЕЧАНИЕ. Настоятельно рекомендуется явно объявить и инициализировать статический окончательный поле типа long и имя 'serialVersionUID' во всех ваших классах, которые вы хотите сделать Serializable, вместо того, чтобы полагаться на вычисление значения по умолчанию для этого поля по умолчанию. Это вычисление чрезвычайно чувствительно и может варьироваться от одной реализации компилятора к другой, и, следовательно, вы можете получить InvalidClassException даже для одного и того же класса только потому, что вы использовали различные реализации компилятора на отправителе и на концах приемника процесса сериализации.

В большинстве случаев вы использовали бы «частный» спецификатор доступа только для этого поля, поскольку объявление обычно применяется только к классу, объявляющему его, и нам действительно не нужно либо наследовать это поле в подклассах OR, либо доступ к нему извне. Итак, вряд ли есть какая-то причина, почему мы не должны держать ее «частной».

1
задан Bernd 17 January 2019 в 17:15
поделиться

1 ответ

Функция clock_nanosleep() POSIX имеет режим абсолютного крайнего срока:

#define NSEC_PER_SEC 1000000000
/* Initial delay, 7.5ms */
const long start_delay_ns = 7500000;
/* Cycle time, 1ms */
const long cycle_time_ns = 1000000;
struct timespec deadline;

clock_gettime(CLOCK_MONOTONIC, &deadline);
deadline.tv_nsec += start_delay_ns;
deadline.tv_sec += deadline.tv_nsec / NSEC_PER_SEC;
deadline.tv_nsec %= NSEC_PER_SEC;

for (;;)
{
    struct timespec now;

    /* Sleep until deadline */
    while (clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, &deadline, NULL) != 0)
        if (errno != EINTR)
            return; /* error handling here */

    pFunction(pArguments);    /* thread function: send data */

    /* Calculate next deadline */
    deadline.tv_nsec += cycle_time_ns;
    deadline.tv_sec += deadline.tv_nsec / NSEC_PER_SEC;
    deadline.tv_nsec %= NSEC_PER_SEC;

    clock_gettime(CLOCK_MONOTONIC, &now);
    if (now.tv_sec > deadline.tv_sec || (now.tv_sec == deadline.tv_sec && deadline.tv_nsec > now.tv_nsec))
        return; /* time overrun error handling here */
}
0
ответ дан caf 17 January 2019 в 17:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: