如何使用Java中的ArrayList使用多线程[英] how to use Multithreading With ArrayList in Java

问题描述

你好,

我有一个完美工作的程序,不幸的是,我有一些时间需要很多时间,几分钟.

我的对象是使用多线程来加速花费太多时间的零件.

在此示例中,我给出了我应该并行化的部分原型

public static ArrayList<Object2> createListOfObject2(ArrayList<Object1> mylist) {
    ArrayList<Object2> 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<Object1> 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<Object2> createListOfObject2(ArrayList<Object1> mylist)

获取object1的列表,并应创建另一个object2.

的列表.

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

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

所以我应该在哪里放置我应该使用的多思格和件列表类型.

第二个问题是类mycalculator是单身班,我只创建一个对象,我认为即使使用multhitReading,真实程序也不会受益于multhitreading.

.

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

非常感谢.

推荐答案

您的对象是单身人士是无关紧要的.重要的是共享可变状态.因此,如果您的计算不突变共享状态,并且每个计算都与其他计算独立,则可以使用平行流:

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

本文地址:https://www.itbaoku.cn/post/978656.html