docs: @SuppressWarnings("deprecation") // in this case we really want to use PeriodicWork.logger since it reports the impl class
      public final void doRun() {
          try {
              if(thread!=null && thread.isAlive()) {
                  logger.log(this.getSlowLoggingLevel(), "{0} thread is still running. Execution aborted.", name);
                  return;
              }
              thread = new Thread(new Runnable() {
                  public void run() {
                      logger.log(getNormalLoggingLevel(), "Started {0}", name);
                      long startTime = System.currentTimeMillis();
                      long stopTime;
  
                      StreamTaskListener l = createListener();
                      try {
                          l.getLogger().printf("Started at %tc%n", new Date(startTime));
                          ACL.impersonate(ACL.SYSTEM);
  
                          execute(l);
                      } catch (IOException e) {
                          Functions.printStackTrace(e, l.fatalError(e.getMessage()));
                      } catch (InterruptedException e) {
                          Functions.printStackTrace(e, l.fatalError("aborted"));
                      } finally {
                          stopTime = System.currentTimeMillis();
                          try {
                              l.getLogger().printf("Finished at %tc. %dms%n", new Date(stopTime), stopTime - startTime);
                          } finally {
                              l.closeQuietly();
                          }
                      }
  
                      logger.log(getNormalLoggingLevel(), "Finished {0}. {1,number} ms",
                              new Object[]{name, stopTime - startTime});
                  }
              },name+" thread");
              thread.start();
          } catch (Throwable t) {
              LogRecord lr = new LogRecord(this.getErrorLoggingLevel(), "{0} thread failed with error");
              lr.setThrown(t);
              lr.setParameters(new Object[]{name});
              logger.log(lr);
          }
      }