Что означает "результат" в ExecutorService.submit(Runnable task, T result)?
Глядя на javadocs, он просто говорит
<T> Future<T> submit(Runnable task, T result)
Отправляет Runnable задачу для выполнения и возвращает Будущее, представляющее эту задачу. Метод Future get вернет данный результат после успешного завершения.
Параметры:
задача - задача представить
результат - результат для возврата
но что он делает с результатом? хранит ли что-нибудь там? он просто использует тип результата для указания типа 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
...
}
Ответ 3
Вы можете мутировать объект, который был передан во время выполнения задачи. Например:
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