【发布时间】:2009-07-08 09:11:38
【问题描述】:
我对 CompletionService 有一些问题。 我的任务:并行解析大约 300 个 html 页面,我只需要等待所有结果 5 秒, 然后 - 将结果返回给主代码。 我决定为此使用 CompletionService + Callable。 问题是如何停止由 CompletionService 引起的所有线程并从成功解析的页面返回结果? 在这段代码中删除了打印行,但我可以说 5 秒就足够了(有很好的结果,但程序等待所有线程完成)。我的代码执行了大约 2 分钟。
我的电话号码:
Collection<Callable<HCard>> solvers = new ArrayList<Callable<HCard>>();
for (final String currentUrl : allUrls) {
solvers.add(new Callable<HCard>() {
public HCard call() throws ParserException {
HCard hCard = HCardParser.parseOne(currentUrl);
if (hCard != null) {
return hCard;
} else {
return null;
}
}
});
}
ExecutorService execService = Executors.newCachedThreadPool();
Helper helper = new Helper();
List<HCard> result = helper.solve(execService, solvers);
//then i do smth with result list
我的调用代码:
public class Helper {
List<HCard> solve(Executor e, Collection<Callable<HCard>> solvers) throws InterruptedException {
CompletionService<HCard> cs = new ExecutorCompletionService<HCard>(e);
int n = solvers.size();
Future<HCard> future = null;
HCard hCard = null;
ArrayList<HCard> result = new ArrayList<HCard>();
for (Callable<HCard> s : solvers) {
cs.submit(s);
}
for (int i = 0; i < n; ++i) {
try {
future = cs.take();
hCard = future.get();
if (hCard != null) {
result.add(hCard);
}
} catch (ExecutionException e1) {
future.cancel(true);
}
}
return result;
}
我尝试使用:
- awaitTermination(5000, TimeUnit.MILLISECONDS)
- future.cancel(true)
- execService.shutdownNow()
- future.get(5000, TimeUnit.MILLISECONDS);
- TimeOutException:我无法获得 TimeOutException。
请帮助我了解我的代码上下文。
提前致谢!
【问题讨论】:
-
你使用缓存线程池有什么原因吗?在最坏的情况下它将启动 300 个线程。考虑使用 FixedThreadPool?
-
已考虑。我通过探查器看到 - 我的代码没有区别。
标签: java multithreading concurrency