如何在Java中使用Multithreading与ArrayList

你好 ,

我有一个完美的程序,不幸的是我有一些需要花费很多时间的计算,几分钟……

我的目标是使用multithreading来加速花费这么多时间的部件。

在这个例子中,我给出了我应该并行化的部分的原型

public static ArrayList createListOfObject2(ArrayList mylist) { ArrayList listToReturn = new ArrayList(); Object2 object2; for (int i = 0; i < mylist.size(); i++) { for (int j = 0; j < mylist.size(); j++) { object2 = heavyCalcul(mylist, i, j); listToReturn.add(object2); } } return listToReturn; } private static Object2 heavyCalcul(ArrayList mylist, int i, int j) { int weight = MyCalculator.getInstance().calcul(mylist.get(i),mylist.get(j)); Object2 Object2 = new Object2(weight); return Object2; } 

如你所见,方法

 public static ArrayList createListOfObject2(ArrayList mylist) 

获取Object1的列表,并应创建另一个object2列表。

我制作了一个双循环循环,每次我创建一个由两个对象形成的对象2时,它应该花费O(n²)次。

对于更大的列表,它需要很长时间。

那么我应该在哪里放置我应该使用的multithreading和哪种类型的列表。

第二个问题是类MyCalculator是一个单例类,我只创建它的一个对象,在我看来,即使使用multithreading,真正的程序也不会受益于multithreading。

使用multithreading时我应该遵循哪些规则?

非常感谢。

你的对象是一个单身的事实是无关紧要的。 重要的是共享可变状态。 因此,如果您的计算不改变共享状态,并且每个计算因此独立于其他计算,您可以只使用并行流:

 myList.parallelStream() .flatMap(first -> myList.stream().map(second -> MyCalculator.getInstance().calcul(first, second))) .collect(Collectors.toList());