Что делает 'result' в ExecutorService.submit (Runnable task, T result)? - PullRequest
20 голосов
/ 23 июня 2011

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

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

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

Параметры:

задача - задача для отправки

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

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

Ответы [ 3 ]

14 голосов
/ 23 июня 2011

Он ничего не делает с результатом - просто держит его.Когда задача успешно завершится, вызов 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;
    }
}

И да, общий тип результата должен совпадать с типом возвращенного будущего.

8 голосов
/ 23 июня 2011

Runnable ничего не возвращает, и Future должен что-то возвращать, поэтому этот метод позволяет заранее определить результат возвращаемого будущего.

Если вы не хотите возвращать что-либо, вы можете вернуть null, и я думаю, что тип Void существует для выражения такого рода вещей.

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

Вы знаете, myFuture.get() вернет null в этом случае, но только после того, как задача будет выполнена, так что вы будете использовать ее для ожидания и выброса любого исключения, которое было сгенерировано в задаче.

* * 1010
4 голосов
/ 19 апреля 2017

Вы можете изменить объект, который был передан во время выполнения задачи.Например:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...