Разница в производительности для получения в будущем с тайм-аутом против опроса CompletionService с тайм-аутом - PullRequest
0 голосов
/ 29 января 2020

Допустим, у меня есть длительная операция, из которой я хотел бы получить результат или тайм-аут, если он занимает слишком много времени.

Есть две разные версии, которые я хотел бы сравнить:

1) Когда мы вызываем poll, мы проверяем, были ли какие-либо элементы помещены во внутреннюю очередь блокировки

ExecutorService executorService = Executors.newFixedThreadPool(4);
CompletionService<String> completionService = new ExecutorCompletionService<>(executorService);

Future<String> future = completionService.submit(() -> {...});
final Future<String> result = completionService.poll(30, TimeUnit.SECONDS);
if (result != null) {
   ...
}

2) Когда мы вызываем get, у нас есть реализация из FutureTask для ожидания

ExecutorService executorService = Executors.newFixedThreadPool(4);
Future<String> future = executorService.submit(() -> {...});
try {
   String result = future.get(30, TimeUnit.SECONDS);
} catch (TimeoutException e) {
   ...
}

По сути, в обеих версиях мы ожидаем, что будущее завершит sh его выполнение, но внутренняя реализация отличается. Будет ли разница в производительности? Я видел этот ответ, который сравнивает CompletionService с CompletableFuture и говорит, что должно быть { ссылка }. Будет ли это то же самое для FutureTask реализации? Если да, было бы здорово услышать лучшее объяснение почему.

...