ExecutorService.submit(Runnable task, T result)中的“result”有什么作用?

2022-09-02 03:48:36

看看它刚刚说的javadocs

<T> Future<T> submit(Runnable task, T result)

提交一个可运行任务以供执行,并返回一个表示该任务的未来。Future 的 get 方法将在成功完成后返回给定的结果。

参数:

任务 - 要提交的任务

result - 要返回的结果

但它对结果有什么影响?它在那里存储任何东西吗?它是否只是使用结果的类型来指定 ?Future<T>


答案 1

它对结果没有任何作用 - 只是持有它。任务成功完成后,调用将返回传入的结果。future.get()

以下是 Executors$RunnableAdapter 的源代码,它显示任务运行后,返回原始结果:

static final class RunnableAdapter<T> implements Callable<T> {
    final Runnable task;
    final T result;
    RunnableAdapter(Runnable  task, T result) {
        this.task = task;
        this.result = result;
    }
    public T call() {
        task.run();
        return result;
    }
}

是的,结果的泛型类型应与返回的未来匹配。


答案 2

Runnable 不返回任何内容,Future 必须返回某些内容,因此此方法允许您预定义返回的未来的结果。

如果你不想返回一个东西,你可以返回null,我认为类型的存在是为了表达那种东西。Void

Future<Void> myFuture = executor.submit(myTask, null);

您知道在这种情况下会返回,但只有在任务运行后才会返回,因此您将使用它来等待并引发任务中引发的任何异常。myFuture.get()null

try {
  myFuture.get();
  // After task is executed successfully
  ...
} catch (ExecutionException e) {
  Throwable c = e.getCause();
  log.error("Something happened running task", c);
  // After task is aborted by exception
  ...
}

推荐