У меня есть класс Clock, работающий как поток. Несколько потоков-производителей должны создавать объекты на основе тактов указанных часов. Производители могут быть настроены с помощью параметра конструктора (double), например productionRate = 550 (то есть 550 объектов каждые 3600 тиков (каждый тик представляет секунду, то есть один час).

В приведенном ниже коде вы можете увидеть преобразование почасовой ставки в число, представляющее, сколько тиков должно пройти между тиками. Если использовать номер моего примера, это будет выполняться каждые 6,54 тика. Теперь я не могу найти способ определить условия if, которые действительно производятся в соответствии со скоростью, что должно быть очевидно при взгляде на код. В настоящее время в большинстве случаев транспортное средство не создается, потому что это неточно.

int curTicks = this.clock.getTicks();
double realFeedRate = 1 / (this.vehicleFeedRate / 3600);

if ((curTicks % (int) Math.round(realFeedRate) == 0 || curTicks - lastExecutionTicks == 0))
{
    //Produce...
}

Теперь, есть ли более чистый способ добиться постоянной производительности и создать 550 (+ - всего несколько) объектов после 3600 тиков (один симулированный час)? К сожалению, я должен использовать свою собственную реализацию класса Clock и не могу использовать таймеры, предоставляемые Java.

0
JFNT 4 Ноя 2018 в 19:32

1 ответ

Лучший ответ

Вы можете сохранить / рассчитать время, когда должно произойти следующее действие, вместо того, чтобы проверять точное количество тиков, которое вы могли не попасть. В какой-то момент вы передадите это сохраненное время / значение, и тогда вы узнаете, что должны выполнить свое действие (например, добавить свой объект). Псевдокод будет выглядеть так:

long nextActionAfterTick;
nextActionAfterTick = /* calculate the next tick */;

while(/* your loop */)
{
    if (nextActionAfterTick < this.clock.getTicks()) {
    {
        doYourAction();
        nextActionAfterTick = /* calculate the next tick */;
    }
}
0
Progman 4 Ноя 2018 в 18:33