code: public Job schedule(String nullableName, Runnable runnable, Schedule when) {
  		Objects.requireNonNull(runnable, "Runnable must not be null");
  		Objects.requireNonNull(when, "Schedule must not be null");
  
  		String name = nullableName == null ? runnable.toString() : nullableName;
  
  		Job job = prepareJob(name, runnable, when);
  		long currentTimeInMillis = timeProvider.currentTime();
  		if(when.nextExecutionInMillis(
  			currentTimeInMillis,
  			job.executionsCount(),
  			job.lastExecutionEndedTimeInMillis()
  			) < currentTimeInMillis) {
  			logger.warn("The job '{}' is scheduled at a paste date: it will never be executed", name);
  		}
  
  		logger.info("Scheduling job '{}' to run {}", job.name(), job.schedule());
  		scheduleNextExecution(job);
  
  		return job;
  	}
docs: Schedule the executions of a process.<br>
  <br>
  If a job already exists with the same name and has the status {@link JobStatus#DONE},
  then the created job will inherit the stats of the existing done job:
  {@link Job#executionsCount()} and {@link Job#lastExecutionTimeInMillis()}
  
  @param nullableName The name of the created job
  @param runnable The process to be executed at a schedule
  @param when The {@link Schedule} at which the process will be executed
  @return The corresponding {@link Job} created.
  @throws NullPointerException if {@code runnable} or {@code when} are {@code null}
  @throws IllegalArgumentException if the same {@code nullableName} is
  scheduled twice whereas the corresponding job status is not {@link JobStatus#DONE}