code: private boolean taskShouldExecute(Task task, TaskRecord taskRecord) {
          String taskID = taskRecord.getTaskID();
          if (taskRecord.getStatus() == TaskStatus.NEVER_EXECUTED) {
              m_logger.debug("Task '{}' has never executed", taskID);
              return true;
          }
          if (taskRecord.getStatus() == TaskStatus.IN_PROGRESS) {
              m_logger.debug("Task '{}' is already being executed", taskID);
              return false;
          }
          
          Calendar startTime = taskRecord.getTime(TaskRecord.PROP_START_TIME);
          long startTimeMillis = startTime == null ? 0 : startTime.getTimeInMillis();
          long taskPeriodMillis = task.getTaskFreq().getValueInMinutes() * 60 * 1000;
          long nowMillis = System.currentTimeMillis();
          boolean bShouldStart = startTimeMillis + taskPeriodMillis <= nowMillis;
          m_logger.debug("Considering task {}: Last started at {}; periodicity in millis: {}; current time: {}; next start: {}; should start: {}",
                        new Object[]{task.getTaskID(),
                                     Utils.formatDateUTC(startTimeMillis, Calendar.MILLISECOND),
                                     taskPeriodMillis,
                                     Utils.formatDateUTC(nowMillis, Calendar.MILLISECOND),
                                     Utils.formatDateUTC(startTimeMillis + taskPeriodMillis, Calendar.MILLISECOND),
                                     bShouldStart});
          return bShouldStart;
      }
docs: and (2) enough time has passed since its last execution that it's time to run.