docs: public void startProgress(A_CmsListDialog list, boolean abortExisting) {
  
          // check the list
          if (list == null) {
              throw new CmsIllegalArgumentException(Messages.get().container(Messages.ERR_PROGRESS_START_INVALID_LIST_0));
          }
  
          // check if created key already exists
          if (m_threads.get(getKey()) != null) {
              if (abortExisting) {
                  if (LOG.isDebugEnabled()) {
                      LOG.debug(Messages.get().getBundle().key(Messages.LOG_PROGRESS_INTERRUPT_THREAD_1, getKey()));
                  }
                  Thread thread = m_threads.get(getKey());
                  thread.interrupt();
              } else {
                  throw new CmsIllegalStateException(
                      Messages.get().container(Messages.ERR_PROGRESS_START_THREAD_EXISTS_0));
              }
          }
  
          // create the thread
          CmsProgressThread thread = new CmsProgressThread(list, getKey(), list.getLocale());
  
          Map<String, CmsProgressThread> threadsAbandoned = new HashMap<String, CmsProgressThread>();
          Map<String, CmsProgressThread> threadsAlive = new HashMap<String, CmsProgressThread>();
          synchronized (m_threads) {
  
              // clean up abandoned threads
              for (Iterator<Map.Entry<String, CmsProgressThread>> iter = m_threads.entrySet().iterator(); iter.hasNext();) {
                  Map.Entry<String, CmsProgressThread> entry = iter.next();
                  CmsProgressThread value = entry.getValue();
  
                  if ((!value.isAlive()) && ((System.currentTimeMillis() - value.getFinishTime()) > CLEANUP_PERIOD)) {
                      threadsAbandoned.put(entry.getKey(), value);
                  } else {
                      threadsAlive.put(entry.getKey(), value);
                  }
              }
  
              // add and start new thread
              threadsAlive.put(thread.getKey(), thread);
              thread.start();
  
              m_threads = threadsAlive;
          }
  
          if (LOG.isDebugEnabled()) {
              for (Iterator<String> iter = threadsAbandoned.keySet().iterator(); iter.hasNext();) {
                  LOG.debug(Messages.get().getBundle().key(Messages.LOG_PROGRESS_CLEAN_UP_THREAD_1, iter.next()));
              }
          }
      }