Подтвердить что ты не робот

Что означает "результат" в ExecutorService.submit(Runnable task, T result)?

Глядя на javadocs, он просто говорит

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

Отправляет Runnable задачу для выполнения и возвращает Будущее, представляющее эту задачу. Метод Future get вернет данный результат после успешного завершения.

Параметры:

   задача - задача представить

   результат - результат для возврата

но что он делает с результатом? хранит ли что-нибудь там? он просто использует тип результата для указания типа Future<T>?

4b9b3361

Ответ 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