当前位置: 首页 > 知识库问答 >
问题:

为什么我的Executor服务每次都接近完成时都会卡住?

柳英资
2023-03-14

简而言之,我有一个List userIds,它的大小可以从10k到100k,这些都是user_ids的,我的核心逻辑是,对于每user_id,我调用两个不同的rest api终端并获取这些有效负载,然后在有效负载之间进行验证操作

我通过以下方式使用executor服务来加快处理速度,我将记录拆分为批处理和预定义的100个线程,以便1个线程可以处理(int)(userIds.size()/100)个用户

public void execute(List < String > userIds) {
    int numberOfThreads = 100;
    int WINDOW = (int) Math.floor(userIds.size() / numberOfThreads);
   
    int st = 0;
    int end = WINDOW;
   
    for (; st < userIds.size();) {
        int realStart = st;
        int realEnd = end;

        executor.execute(
            () - > {
                verify(realStart, realEnd, userIds) // this method has logic to verify users for the given start and end indexes from the userIds list

            }
        )
    
    st = end + 1;
    if (end + WINDOW >= userIds.size()) {
        end = userIds.size() - 1;
    } else {
        end = st + WINDOW;
    } // code to update the indexes realStart and realEnd for next 'n' batches
}
executor.shutDown();
try {
    System.out.println("Done");
    executor.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS);
    System.out.println("Done on a rope");
} catch (Exception e) {
    e.printStackTrace();
}
}

比方说,对于10k记录,当它接近完成时,代码被卡住了,这让我想,如果ExecutorService中有几个线程被卡住了,如果是,我该如何解决它,或者我在这里是否有任何明显的缺陷?感谢您的帮助:)

共有1个答案

陶博赡
2023-03-14

假设有100个线程,一切都正常,您的系统可以处理它。

然后问题可以在方法中。比如说,你有10000个用户-

  1. 验证()方法的逻辑无法处理它
  2. 用户ID的在列表userIds中不是唯一的,并且多个线程正在尝试同时处理相同的userId,并且可能会被与该用户ID相关的一些资源锁定。
  3. 线程相互阻塞的其他问题,但同样-这取决于您的应用程序逻辑

注意:executor.await终止(Long.MAX_VALUE, TimeUnit. SECONDS);只告诉执行器是否完成了它的处理,它不会在时间过去后强制它终止。根据Oracle的说法,正确的完成方式是:

executor.shutdown();
try {
    if (!executor.awaitTermination(800, TimeUnit.MILLISECONDS)) {
        executor.shutdownNow();
    } 
} catch (InterruptedException e) {
    executor.shutdownNow();
}

另一个注意事项:您可以使用而(st

 类似资料:
  • 问题内容: 当尝试使用maven构建Web应用程序时,当我的Internet连接处于连接状态时,通常会出现以下错误。 我的问题是,为什么在较早构建同一应用程序时,maven总是每次都要下载。 我的配置每次Maven都要下载时可能出什么毛病? 以下是我尝试离线构建时遇到的错误: 问题答案: 在您的元素(或项目的父级或公司父级POM)中查找该元素。它看起来像下面的样子。 注意元素。该示例告诉Maven

  • 我有一个JavaScript应用程序,我正在与webpack捆绑。根据文档,我正在使用以下命令开始绑定: 每次我得到这个输出: 我已验证我的npx正在查看的目录。有人能想到为什么每次都在下载网页吗?完成此步骤最多需要7秒,这会减慢我的构建速度。

  • 问题内容: 据我了解,默认容量为10,并且当其超过10时,它将创建具有新容量的新对象,依此类推。 因此,出于好奇,我输入下面的程序来检查的对象: 根据上述情况,当我未将默认初始容量设置为10时,因此在添加第11个元素时,它将创建一个新对象并增加的容量。 当我打印对象的哈希码时,每次都会给出一个新值。 以下是o / p: 根据默认容量的概念,直到第10个元素之前,都应打印相同的内容,因为在此之前不需

  • uniapp 为什么每次进来都会执行onLoad钩子? 症状:不管是第一次还是第N次进去都会执行onload,印象中应该只有第一次进来才会执行一次吧,有谁遇到过吗,难道是用redirectTo跳转才会这样吗

  • 根据我对的理解,默认容量为10,当它超过10时,它将创建一个具有新容量的新对象,依此类推。 所以出于好奇,我键入以下程序来检查对象的: 根据上述场景,当我没有为设置初始容量时,默认值为10。因此,在添加第11个元素时,它将创建一个新对象,并增加的容量。 当我打印对象的hashcode时,它每次都会给出一个新的。 以下是o/p: 根据默认容量的概念,直到第10个元素,它应该打印相同的,因为在那之前不

  • 每当我试图进入我的repo-git时,它都会同时请求