Java 我如何用几个线程来完成大量的作业,每个线程都有相同的超时时间来完成?
我试图实现的一个想法如下Java 我如何用几个线程来完成大量的作业,每个线程都有相同的超时时间来完成?,java,future,executorservice,executor,Java,Future,Executorservice,Executor,我试图实现的一个想法如下 我有1000个URL可以从中下载数据,用于后期处理(比如,计算一些统计数据)。 我并不需要所有的下载都能成功完成,但要尽可能多的下载 我假设某些位置可能不可用,要么没有任何有价值的响应(例如HTTP 503),要么处理请求所需的时间超过10秒 我有T=5个线程来并行处理URL,每个线程都有相同的超时时间 一旦一个人完成了(我期望发生的事情要早得多),我就会收集一些统计数据(这是一个非常快速的操作),然后开始下一次下载(如果有的话) 到目前为止,我提出的解决办法是 Exe
ExecutorService executorService = Executors.newFixedThreadPool(T);
ExecutorCompletionService<MyResult> completionService = new ExecutorCompletionService<>(executorService);
urls.forEach(url -> {
Callable<MyResult> callable = () -> new MyResult(url);
completionService.submit(callable);
});
for (int i = 0; i < urls.size(); i++) {
Future<MyResult> resultFuture = completionService.poll(TO, TimeUnit.SECONDS);
if (resultFuture == null)
continue;
MyResult myResult = resultFuture.get();
myAggregate(myResult.getRate());
}
ExecutorService ExecutorService=Executors.newFixedThreadPool(T);
ExecutorCompletionService completionService=新的ExecutorCompletionService(executorService);
forEach(url->{
Callable Callable=()->newmyresult(url);
completionService.submit(可调用);
});
对于(int i=0;i
这看起来有点像我正在努力实现的目标。但举例来说,它既不给每次下载相同的超时时间,也不正确地取消未来。那么,正确的解决方案是什么呢?尝试使用invokeAll方法,只需将可调用项放入列表中,然后在ExecutorService上调用invokeAll(),给它一个超时作为第二个和第三个参数
executorService.invokeAll(callableList, 20, TimeUnit.SECONDS);
正如我前面提到的,我的意图是给每个未来赋予相同的超时时间,而
invokeAll
将精确等待20秒,无论callableList
有多大。