【问题标题】:Loops asynchronous using Multithreading使用多线程异步循环
【发布时间】:2017-08-02 04:11:04
【问题描述】:

我有嵌套循环。我知道没有办法减少嵌套循环完成所花费的时间。但是我们如何才能使用多线程或执行器服务更快地完成循环。

例如:

for(String str : ListA){
  for(String str1 : ListB){
     for(String str2 : ListC){
         //do Something
     }
  }
}

所以我知道完成循环需要 MNP(其中 M,N,P 是列表的大小)次。但是我如何在这里利用多线程并通过执行异步作业更快地完成循环。我想像使用 java 7 一样使用 Executor Service(不能使用并行流)。

我试过了:

ExecutorService executor = Executors.newFixedThreadPool(10);
for(String str : ListA){
     executor.execute(new Runnable() {
    @Override
    public void run() {
      for(String str1 : ListB){
        for(String str2 : ListC){
         //do Something
        }
      }
    } });
 }

但我相信上述过程是启动线程 10 次但执行相同的事情 10 次,这不是循环的工作方式。有人可以建议我如何使用 Java 中的多线程执行器服务来完成这个循环吗?

【问题讨论】:

标签: java multithreading


【解决方案1】:

循环足够快,您无需对其进行优化。您在 //do something 中执行的实际代码可能是一个问题,如果它有阻塞行为。在这种情况下,您可以执行以下操作

ExecutorService executor = Executors.newFixedThreadPool(10);

List<String> level1 = Arrays.asList("1", "2", "3");
List<String> level2 = Arrays.asList("a", "b", "c");
List<String> level3 = Arrays.asList("x", "y", "z");
for(String l1 : level1){
  for(String l2 : level2){
     for(String l3 : level3){
        executor.execute(new Runnable() {
            @Override
            public void run() {
                get("http://foo.com/"+l1+"/"+l2+"/"+l3);
            }
        });
     }
  }
}

【讨论】:

  • 这只有在 //do something 的结果不依赖于循环的其他迭代时才有效
  • @SteelToe 结果需要保存在列表中。但我这里有个问题。任何人都可以请建议。我需要将做某事的结果保存在 JSONObject 中。我创建了 JSONOBject jsonObject=null;并尝试在“doSomething”中使用它,但它说要让 JSONOBject 成为最终的,在做出最终的决定后我收到一个错误:“无法引用封闭范围内定义的非最终局部变量 jsonObject”
  • @karthikdivi 感谢您的建议。但是你能在这里给我一些建议吗?当我按照您建议的方式实施时,我需要将 dosomething 的结果保存在 JSONObject 中。我创建了 JSONOBject jsonObject=null;并尝试在“doSomething”中使用它,但它说要让 JSONOBject 成为最终的,在做出最终的决定后我收到一个错误:“无法引用封闭范围内定义的非最终局部变量 jsonObject”
  • 如果你想让 //do Something 并行,那么应该隔离那段代码,否则你会遇到问题。您能否提供更多代码并尝试提及您要解决的确切问题?然后我可以想到使用并行的正确方法。
  • 基本上我想基于三个字符串(str、str1、str2)进行 API 调用。因此,我不想循环它,而是想让循环在 java 7 中并行执行。假设 str2 有 3 个值 {a,b,c},str2 有 4 个值{1,2,3,4},str 有两个值: {x,y} 然后我想在这里进行所有组合。假设 str 有 x,str2 有 1 用于初始循环现在我想让这些调用并行,如:http:apicall/x/1/a,http:apicall/x/1/b,http:apicall/x /1/c。所以基本上在这里我想启动三个线程并一次性完成最里面的循环来完成它。 @karthikdivi
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-17
  • 2012-06-18
  • 1970-01-01
  • 2011-02-13
  • 2021-12-12
  • 2018-07-29
相关资源
最近更新 更多