/**
   * Start up the progress meter, printing initialization message and starting up the daemon thread
   * for periodic printing.
   */
  @Requires("progressMeterDaemon != null")
  private synchronized void start() {
    timer.start();
    lastProgressPrintTime = timer.currentTime();

    logger.info("[INITIALIZATION COMPLETE; STARTING PROCESSING]");
    logger.info(
        String.format(
            "%15s processed.%s  runtime per.1M.%s completed total.runtime remaining",
            "Location", processingUnitName, processingUnitName));

    progressMeterDaemon.start();
  }
  /** Should be called when processing is done */
  public void notifyDone(final long nTotalRecordsProcessed) {
    // print out the progress meter
    this.nTotalRecordsProcessed = nTotalRecordsProcessed;
    this.positionMessage = "done";
    printProgress(true);

    logger.info(
        String.format(
            "Total runtime %.2f secs, %.2f min, %.2f hours",
            timer.getElapsedTime(), timer.getElapsedTime() / 60, timer.getElapsedTime() / 3600));

    if (performanceLog != null) performanceLog.close();

    // shutdown our daemon thread
    progressMeterDaemon.done();
  }