我试图实现一个功能,其中或者可以在规定的时间内完成可调参数或者操作超时。我曾希望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:
我试着用下面替换try块内容,以堵塞避免的Future.get(),但是这并没有帮助
if (voidFuture.isDone()) {
voidFuture.get();
}
介意分享了downvote这样我可以提高我在未来的问题的原因是什么? – mindreader