@Override
  public List<Runnable> shutdownNow() {
    _mainLock.lock();

    try {
      int state = _runState;

      if (state < _STOP) {
        _runState = _STOP;
      }

      for (WorkerTask workerTask : _workerTasks) {
        workerTask._thread.interrupt();
      }

      List<Runnable> runnables = new ArrayList<Runnable>();

      _taskQueue.drainTo(runnables);

      _tryTerminate();

      return runnables;
    } finally {
      _mainLock.unlock();
    }
  }
  private Runnable _getTask(WorkerTask workerTask, boolean[] cleanUpMarker) {
    while (true) {
      try {
        int state = _runState;

        if (state >= _STOP) {
          return null;
        }

        Runnable runnable = null;

        if (state == _SHUTDOWN) {
          runnable = _taskQueue.poll();
        } else if ((_poolSize > _corePoolSize) || _allowCoreThreadTimeout) {

          runnable = _taskQueue.poll(_keepAliveTime, TimeUnit.NANOSECONDS);
        } else {
          runnable = _taskQueue.take();
        }

        if (runnable != null) {
          return runnable;
        }

        _mainLock.lock();

        try {
          if ((_runState >= _STOP)
              || ((_runState >= _SHUTDOWN) && _taskQueue.isEmpty())
              || (_allowCoreThreadTimeout && ((_poolSize > 1) || _taskQueue.isEmpty()))
              || (!_allowCoreThreadTimeout && (_poolSize > _corePoolSize))) {

            _completedTaskCount += workerTask._localCompletedTaskCount;

            _workerTasks.remove(workerTask);

            if (--_poolSize == 0) {
              _tryTerminate();
            }

            cleanUpMarker[0] = true;

            return null;
          }
        } finally {
          _mainLock.unlock();
        }
      } catch (InterruptedException ie) {
      }
    }
  }
  @Override
  public void shutdown() {
    _mainLock.lock();

    try {
      int state = _runState;

      if (state < _SHUTDOWN) {
        _runState = _SHUTDOWN;
      }

      for (WorkerTask workerTask : _workerTasks) {
        workerTask._interruptIfWaiting();
      }

      _tryTerminate();
    } finally {
      _mainLock.unlock();
    }
  }