/** sets a flag to stop this task thread. */
  public void stopMe() {
    if (logger.isInfoEnabled()) {
      logger.info("interrupting ");
    }

    this.interrupt();

    SystemProperties props = SystemProperties.instance();
    int shutdown_time = props.getPropertyAsInt(Constants.THREADPOOL_SHUTDOWN_WAIT_TIME);

    if (logger.isTraceEnabled()) {
      logger.trace("sleeping for [" + shutdown_time + "] msecs");
    }

    try {
      // I need to put myself to sleep for awhile to give the
      // other threads a chance to stop themselves nicely.
      Thread.sleep(shutdown_time);
    } catch (InterruptedException ex) {

      if (logger.isInfoEnabled()) {
        logger.info("interrupted exception: " + ex.getMessage());
      }
    }

    v_stop_me = true;
  }
  /* (non-Javadoc)
   * @see java.lang.Thread#start()
   */
  @Override
  public void start() {

    if (!v_stop_me) {
      if (logger.isTraceEnabled()) {
        logger.trace("launching thread.");
      }

      super.start();

      try {

        SystemProperties props = SystemProperties.instance();
        int start_time = props.getPropertyAsInt(Constants.THREADPOOL_START_UP_TIME);

        if (logger.isTraceEnabled()) {
          logger.trace("sleeping for [" + start_time + "] msecs");
        }

        // I need to put myself to sleep for awhile to give the
        // other thread a chance to start nicely.
        Thread.sleep(start_time);
      } catch (InterruptedException ex) {

        if (logger.isInfoEnabled()) {
          logger.info("interrupted exception: " + ex.getMessage());
        }

        v_stop_me = true;
      }

      if (logger.isTraceEnabled()) {
        logger.trace("constructed.");
      }
    }
  }