Java 我如何用几个线程来完成大量的作业,每个线程都有相同的超时时间来完成?

Java 我如何用几个线程来完成大量的作业,每个线程都有相同的超时时间来完成?,java,future,executorservice,executor,Java,Future,Executorservice,Executor,我试图实现的一个想法如下 我有1000个URL可以从中下载数据,用于后期处理(比如,计算一些统计数据)。 我并不需要所有的下载都能成功完成,但要尽可能多的下载 我假设某些位置可能不可用,要么没有任何有价值的响应(例如HTTP 503),要么处理请求所需的时间超过10秒 我有T=5个线程来并行处理URL,每个线程都有相同的超时时间 一旦一个人完成了(我期望发生的事情要早得多),我就会收集一些统计数据(这是一个非常快速的操作),然后开始下一次下载(如果有的话) 到目前为止,我提出的解决办法是 Exe

我试图实现的一个想法如下

  • 我有1000个URL可以从中下载数据,用于后期处理(比如,计算一些统计数据)。 我并不需要所有的下载都能成功完成,但要尽可能多的下载
  • 我假设某些位置可能不可用,要么没有任何有价值的响应(例如HTTP 503),要么处理请求所需的时间超过10秒
  • 我有T=5个线程来并行处理URL,每个线程都有相同的超时时间
  • 一旦一个人完成了(我期望发生的事情要早得多),我就会收集一些统计数据(这是一个非常快速的操作),然后开始下一次下载(如果有的话)
  • 到目前为止,我提出的解决办法是

    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
    有多大。