code: public <T> T executeAbortable(ExecutorService exec, Callable<T> callable)
              throws IOException, InterruptedException, ExecutionException {
          Future<T> task = exec.submit(callable);
          waitAbortable(task);
          return task.get();
      }
docs: Execute callable, which may not be interruptable by itself, but listen to
  terminal input and abort the task if CTRL-C is pressed.
  
  @param exec The executor to run task on.
  @param callable The callable function.
  @param <T> The return type of the callable.
  @return The result of the callable.
  @throws IOException If aborted or read failure.
  @throws InterruptedException If interrupted while waiting.
  @throws ExecutionException If execution failed.