Асинхронный вызов в Callable - PullRequest
       10

Асинхронный вызов в Callable

0 голосов
/ 27 октября 2018

Рассмотрим следующий код Java (упрощенная версия того, с чем я работаю - если есть ошибки, это потому, что я не запускал его через компилятор):

CountdownLatch latch = new CountdownLatch(collection.size());

for(Whatever thing : collection){

    provider.doWork(thing, result -> {
        process(result);
        latch.countDown();
    };
}

try {
    latch.await();
} catch (InterruptedException ignore) {}

doMoreWork();

Итак, я запускаю числоасинхронных задач, и дождитесь их выполнения, прежде чем продолжить.Прямо сейчас я накапливаю результат асинхронных задач в списке.Это работает, и это хорошо, но я смотрю, есть ли более чистая реализация, использующая Futures или что-то подобное.Проблема заключается в асинхронном вызове.Предполагается, что Callable возвращает результат своей работы, но результат этой работы будет известен только позже.Не стоит переписывать doWork, чтобы быть синхронным.Должен ли я просто оставить это в покое, или есть вариант там?Отчасти мой интерес к лучшему коду, но отчасти просто к тому, чтобы больше узнать о вариантах параллелизма.Если это имеет значение, это в приложении для Android.

1 Ответ

0 голосов
/ 31 октября 2018

Это подход, использующий ExecutorService и Future, который не тестировался на Android, но все доступны на уровне API 1:

ExecutorService executor = Executors.newFixedThreadPool(10);
List<Future<String>> pending = new ArrayList<Future<String>>();
for(Whatever thing : collection) {
    Future<String> future = executor.submit(new Callable<String>() {
        public String call() throws Exception {
            return doWork();
        }
    });
    pending.add(future);
}
for (Future<String> result : pending) {
    System.out.println("Your result ASAP:" + result.get());
}
executor.shutdown();

Он вернется, как только текущий элемент будет выполнен, в порядкебыли представлены.

...