看看javadocs它只是说
<T> Future<T> submit(Runnable task, T result)
提交Runnable任务以执行并返回表示该任务的Future。 Future的get方法将在成功完成后返回给定的结果。
参数:
任务 - 提交的任务
结果 - 返回的结果
但它对结果有什么作用?它存储了什么吗?它只是使用结果类型来指定Future<T>
的类型吗?
答案 0 :(得分:14)
它对结果没有任何作用 - 只是持有它。任务成功完成后,调用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匹配。
答案 1 :(得分:8)
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
...
}
答案 2 :(得分:4)
您可以改变在任务期间传入的对象。例如:
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