@Override
  public void dispose() {
    if (logger.isDebugEnabled()) {
      logger.debug("Waiting for works to finish execution");
    }

    long initialMillis = System.currentTimeMillis();

    while (workTracker.pendingWorks().size() != 0 && !isTimeoutExpired(initialMillis)) {
      try {
        Thread.sleep(waitMillis);
      } catch (InterruptedException e) {
        Thread.currentThread().interrupt();
      }
    }

    if (logger.isDebugEnabled()) {
      logger.debug(
          String.format(
              "Stop waiting for works completion. There are %s works unfinished works",
              workTracker.pendingWorks().size()));
    }

    workTracker.dispose();
  }