【问题标题】:Java : a method to do multiple calculations on arrays quicklyJava:一种快速对数组进行多次计算的方法
【发布时间】:2014-09-15 05:20:07
【问题描述】:

抱歉,如果这里不适合回答这些问题,但我需要一些基本帮助。

我有一个名为Differential 的类,它有一个成员变量mValues (List>)。我想要做的是遍历所有值并将它们相互比较。这意味着对于五个值,我要进行 10 次比较。但是,这将用于至少 20,000 个列表。我想做三个计算,我想知道我应该如何处理这个问题。

我目前的想法来自this multi-threading example

我在想我会使用 completionService 来遍历多线程中的值。然后每个线程将处理多个计算并返回它们。这看起来合适吗?有没有一种我没有意识到的快速执行此操作的方法?

【问题讨论】:

  • 如果您被允许使用 Java 8,那么可能值得看看新的 lambda 表达式
  • 我该怎么做呢?我可以使用 java 8
  • 执行所有比较吗?意思是,可以通过执行子集比较得出您想要达到的最终点吗?
  • 为了能够使用 lambda 和流操作的并行性,第一步是以可以并行化单个步骤的方式来制定问题。然后每个步骤都必须作为一些 map 或 reduce 任务来实现。但要做到这一点,至少应该对 java 中的 lambda 和流有一些基本经验
  • 您的问题非常广泛——基本上是“并发如何工作?” - 你没有告诉我们你如何或为什么要比较列表中的值。我认为你正在做的一个具体的例子(在代码中)是有序的。

标签: java multithreading large-data


【解决方案1】:

在您制作多线程版本之前,我建议您制作单线程版本并向我们展示代码。然后,您可以轻松拆分 for 循环(序列)的工作。下面省略了很多细节。

mysequence = ...//array or list
//2 threads
c1=new Callable(){
Object call(){
  for(i=0...mysequence.size()/2)
     //do work
   }
return result;
}
c2=new Callable(){
Object call(){
  for(i=mysequence.size()/2+1 ... mysequence.size()-1)
     //do work
   }
return result;
}
ExecutorService exec=Executors.xxxThreadPool(2);
fut1= exec.submit(c1)
fut2 =exec.submit(c2)

fut1.get()
fut2.get()

让我找到我另一篇文章的链接。在这里查看我的答案以获得更好的示例。 Thread won't naturally exit at end of run()

【讨论】:

    猜你喜欢
    • 2016-10-04
    • 1970-01-01
    • 2020-07-07
    • 2015-01-15
    • 1970-01-01
    • 1970-01-01
    • 2013-04-17
    • 2016-02-21
    • 1970-01-01
    相关资源
    最近更新 更多