docs: @Override
      public void close() {
          synchronized (startedTasks) {
              if (executor.isShutdown()) {
                  return;
              }
              // ... stop updater thread. Do not interrupt.
              executor.shutdown();
              try {
                  updater.get();
              } catch (InterruptedException | CancellationException | ExecutionException ignore) {
                  // Ignore these closing thread errors.
              }
              // And stop all the tasks, do interrupting.
              for (InternalTask task : startedTasks) {
                  task.cancel(true);
              }
              for (InternalTask task : queuedTasks) {
                  task.close();
              }
  
              try {
                  executor.awaitTermination(100L, TimeUnit.MILLISECONDS);
              } catch (InterruptedException ignore) {
                  Thread.currentThread().interrupt();
              }
          }
      }