'result' in ExecutorService.submit(Runnable task, T result) 是做什么的?



查看javadocs,它只显示

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

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

参数:

task-要提交的任务

result-返回的结果

但它和结果有什么关系?那里有什么东西吗?它只是使用结果的类型来指定Future<T>的类型吗?

它对结果不做任何事情,只保存它。当任务成功完成时,调用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;
    }
}

是的,结果的泛型类型应该与返回的Future的泛型类型匹配。

Runnable不返回任何内容,Future必须返回一些内容,因此此方法允许您预定义返回的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
  ...
}

您可以更改任务期间传入的对象。例如:

final String[] mutable = new String[1];
Runnable r = new Runnable() {
    public void run() {
        mutable[0] = "howdy";
    }
};
Future<String[]> f = executorService.submit(r, mutable);
String[] result = f.get();
System.out.println("result[0]: " + result[0]);

当我运行此代码时,它输出:

result[0]: howdy

相关内容

最新更新