def _start(self, other, immediate, required, threadPool):
    immediate = bool(immediate)
    required = bool(required)
    otherTasks = _makeTasks(other)
    if threadPool is None:
      threadPool = getDefaultThreadPool()

    self._lock.acquire()
    try:
      if self._state is not Task.State.NEW:
        raise TaskError("task already started")
      self._state = Task.State.WAITING_FOR_START
      self._startAfterCount = len(otherTasks) + 1
      self._immediate = immediate
      self._threadPool = threadPool
      if required:
        self._required = True
      else:
        required = self._required