docs: @Override
      public String dump() {
          final StringBuilder builder = new StringBuilder();
          if (mExecutor instanceof ThreadPoolExecutor) {
              // thread pool info
              final ThreadPoolExecutor executor = (ThreadPoolExecutor) mExecutor;
              final int corePoolSize = executor.getCorePoolSize();
              final int poolSize = executor.getPoolSize();
              final int activeCount = executor.getActiveCount();
              final long taskCount = executor.getTaskCount();
              final long completedCount = executor.getCompletedTaskCount();
              final boolean isShutdown = executor.isShutdown();
              final boolean isTerminated = executor.isTerminated();
              builder.append(TAG).append("[ ");
              builder.append("ThreadPool:{")
                      .append(" coreSize:").append(corePoolSize).append(";")
                      .append(" poolSize:").append(poolSize).append(";")
                      .append(" isShutdown:").append(isShutdown).append(";")
                      .append(" isTerminated:").append(isTerminated).append(";")
                      .append(" activeCount:").append(activeCount).append(";")
                      .append(" taskCount:").append(taskCount).append(";")
                      .append(" completedCount:").append(completedCount).append(";")
                      .append("}\n");
          } else {
              // thread pool info
              final ExecutorService executor = mExecutor;
              final boolean isShutdown = executor.isShutdown();
              final boolean isTerminated = executor.isTerminated();
              builder.append(TAG).append("[ ");
              builder.append("ThreadPool:{")
                      .append(" isShutdown:").append(isShutdown).append(";")
                      .append(" isTerminated:").append(isTerminated).append(";")
                      .append("}\n");
          }
          // group map
          final Map<String, List<String>> callerMap = mGroups;
          builder.append("Groups:{");
          for (Map.Entry<String, List<String>> entry : callerMap.entrySet()) {
              builder.append(" group:").append(entry.getKey())
                      .append(", tags:").append(ThreadUtils.toString(entry.getValue())).append(";");
          }
          builder.append("}\n");
          builder.append("]");
  
          // task map
          Map<String, ITaskRunnable> taskMap = mTasks;
          builder.append("Tasks:{");
          for (Map.Entry<String, ITaskRunnable> entry : taskMap.entrySet()) {
              builder.append(" tag:").append(entry.getKey())
                      .append(", runnable:").append(entry.getValue()).append(";");
          }
          builder.append("}\n");
  
          final String info = builder.toString();
          Log.v(TAG, info);
          return info;
      }