code: public final Object start(int priority)
      {
          started_date = new Date();
  
          if (parent_process != null || in_process)
          {
              return_object = null;
  
              doRun();
  
              return return_object;
          }
  
          if (thread_pool != null)
          {
              try
              {
                  synchronized (thread_set_mutex)
                  {
                      thread = (Thread)thread_pool.borrowObject();
  
                      synchronized (pool_borrow_mutex)
                      {
                          ((WorkerThread)thread).execute(this, pool_mutex);
                          try {
                              pool_borrow_mutex.wait();
                          }
                          catch (InterruptedException ie) {}
                      }
                  }
  
              }
              catch (Exception e)
              {
                  throw new QueujException(e);
              }
          }
          else
          {
              // Do not check that the Thread is null first.
              synchronized (thread_set_mutex)
              {
                  thread = new Thread(this);
              }
              if (name == null)
                  thread.setName("BackgroundProcess - " + thread.getName());
              else
                  thread.setName (name);
              thread.setPriority(priority);
              thread.setDaemon(true);
              thread.start();
          }
  
          return null;
      }
docs: start is used to start the processing. run() is called directly if this is a child process
  or in a separate thread if this is a parent process.