private void startTask() {

    if (m_TaskRunning == false && m_TaskQueue.size() > 0) {
      Thread activeTaskThread;
      activeTaskThread = new Thread() {
	  public void run() {
	    m_TaskRunning = true;
	    Task currentTask = (Task)m_TaskQueue.pop();
	    String taskId = (String)m_TaskIdQueue.pop();
	    TaskStatusInfo tsi = (TaskStatusInfo)m_TaskStatus.get(taskId);
	    tsi.setExecutionStatus(TaskStatusInfo.PROCESSING);
	    tsi.setStatusMessage("RemoteEngine ("
				 +m_HostName
				 +") : task " + taskId + " running...");
	    try {
	      System.err.println("Launching task id : "
				 + taskId + "...");
	      currentTask.execute();
	      TaskStatusInfo runStatus = currentTask.getTaskStatus();
	      tsi.setExecutionStatus(runStatus.getExecutionStatus());
	      tsi.setStatusMessage("RemoteExperiment ("
				   +m_HostName+") "
				   +runStatus.getStatusMessage());
	      tsi.setTaskResult(runStatus.getTaskResult());
	    } catch (Error er) {
              // Object initialization can raise Error, which are not subclass of Exception
	      tsi.setExecutionStatus(TaskStatusInfo.FAILED);
              if (er.getCause() instanceof java.security.AccessControlException) {
                tsi.setStatusMessage("RemoteEngine ("
                                     +m_HostName
                                     +") : security error, check remote policy file.");
                System.err.println("Task id " + taskId + " Failed! Check remote policy file");
              }
              else {
                tsi.setStatusMessage("RemoteEngine ("
                                     +m_HostName
                                     +") : unknown initialization error.");
                System.err.println("Task id " + taskId + " Unknown initialization error");
              }
	    } catch (Exception ex) {
	      tsi.setExecutionStatus(TaskStatusInfo.FAILED);
              if (ex instanceof java.io.FileNotFoundException) {
                tsi.setStatusMessage("RemoteEngine ("
                                     +m_HostName
                                     +") : " + ex.getMessage());
                System.err.println("Task id " + taskId + " Failed, " + ex.getMessage());
              }
              else {
                tsi.setStatusMessage("RemoteEngine ("
                                     +m_HostName
                                     +") : task " + taskId + " failed.");
                System.err.println("Task id " + taskId + " Failed!");
              }
	    } finally {
	      if (m_TaskStatus.size() == 0) {
		purgeClasses();
	      }
	      m_TaskRunning = false;
	      // start any waiting tasks
	      startTask();
	    }
	  }
	};
      activeTaskThread.setPriority(Thread.MIN_PRIORITY);
      activeTaskThread.start();
    }
  }