Выполнить Java-код X раз в течение 3600 тиков - PullRequest
0 голосов
/ 04 ноября 2018

У меня класс 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.

1 Ответ

0 голосов
/ 04 ноября 2018

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

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

while(/* your loop */)
{
    if (nextActionAfterTick < this.clock.getTicks()) {
    {
        doYourAction();
        nextActionAfterTick = /* calculate the next tick */;
    }
}
...