【发布时间】:2014-05-21 19:35:28
【问题描述】:
我使用执行器服务来启动多个线程来向 api 发送请求并取回数据。有时我看到一些线程还没有完成他们的工作,服务已经杀死了那个线程,我怎样才能强制服务等到线程完成他们的工作?
这是我的代码:
ExecutorService pool = Executors.newFixedThreadPool(10);
List<Future<List<Book>>> futures = Lists.newArrayList();
final ObjectMapper mapper1 = new ObjectMapper();
for (final Author a : authors) {
futures.add(pool.submit(new Callable<List<Book>>() {
@Override
public List<Book> call() throws Exception {
String urlStr = "http://localhost/api/book?limit=5000&authorId=" + a.getId();
List<JsonBook> Jsbooks = mapper1.readValue(
new URL(urlStr), BOOK_LIST_TYPE_REFERENCE);
List<Book> books = Lists.newArrayList();
for (JsonBook jsonBook : Jsbooks) {
books.add(jsonBook.toAvro());
}
return books;
}
}));
}
pool.shutdown();
pool.awaitTermination(3, TimeUnit.MINUTES);
List<Book> bookList = Lists.newArrayList();
for (Future<List<Book>> future : futures) {
if (!future.isDone()) {
LogUtil.info("future " + future.toString()); <-- future not finished yet
throw new RuntimeException("Future to retrieve books: " + future + " did not complete");
}
bookList.addAll(future.get());
}
我在 (!future.isDone()) 块中看到了一些异常。当执行程序服务关闭时,我如何确保每个未来都完成?
【问题讨论】:
-
有哪些例外?似乎
Futures 正在完成,但在 api 调用中出现异常。