我有一些CompletionService的問題。 我的任務:解析約300頁的HTML頁面,我需要等待所有的結果只有5秒,然後 - 返回結果到主代碼。 我決定爲此使用CompletionService + Callable。 問題是如何停止由CompletionService引起的所有線程,並返回成功解析的頁面結果?在這段代碼中刪除了printlines,但我可以說5秒就足夠了(有很好的結果,但程序會等待所有線程完成)。我的代碼執行了大約2分鐘。completionservice:如何殺死所有線程並通過5秒返回結果?
我的調用代碼:
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? – akarnokd 2009-07-08 15:37:45
考慮。我通過分析器看到 - 我的代碼沒有區別。 – dementiev 2009-07-13 12:16:22