Допустим, у меня есть длительная операция, из которой я хотел бы получить результат или тайм-аут, если он занимает слишком много времени.
Есть две разные версии, которые я хотел бы сравнить:
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
реализации? Если да, было бы здорово услышать лучшее объяснение почему.