Я пытаюсь реализовать функцию, в которой либо вызывающие абоненты заканчиваются в указанное время, либо время выполнения операции. Я надеялся, что ExecutorService.awaitTermination()
сделает это, но был удивлен, увидев, что это не так. Код ниже. Запуск никогда не завершается.ExecutorService.awaitTermination() никогда не отключается
public class Counter implements Callable<Void> {
public static void main(String[] args) throws InterruptedException {
final Map<String, Counter> map = new HashMap<>();
map.put("", new Counter());
final Map<String, Future<Void>> result = executeTasksInParallel(map);
final Future<Void> voidFuture = result.get("");
try {
voidFuture.get();
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public Void call() throws Exception {
for (long i = 0L; i < Long.MAX_VALUE; i++);
return null;
}
public static <K, V> Map<K, Future<V>> executeTasksInParallel(final Map<K, ? extends Callable<V>> callablesById) throws InterruptedException {
final Map<K, Future<V>> resultFuturesById = new HashMap<>();
final ExecutorService executorService = Executors.newFixedThreadPool(callablesById.size());
for (final Map.Entry<K, ? extends Callable<V>> callableByIdEntry : callablesById.entrySet()) {
final K id = callableByIdEntry.getKey();
final Callable<V> callable = callableByIdEntry.getValue();
final Future<V> resultFuture = executorService.submit(callable);
resultFuturesById.put(id, resultFuture);
}
executorService.shutdown();
executorService.awaitTermination(5L, TimeUnit.SECONDS);
return resultFuturesById;
}
}
Я что-то пропустил? Благодаря!
UPDATE:
Я пытался заменить содержимое попробовать блок с ниже, чтобы избежать Future.get() от блокировки, но это не помогло ни
if (voidFuture.isDone()) {
voidFuture.get();
}
ума? – mindreader