Java 使用多线程对数组求和

Java 使用多线程对数组求和,java,multithreading,Java,Multithreading,我有一个大小为n的数组,其中填充了数字1..n 我需要使用m个线程对这个数组求和,每次取两个元素,求和并将求和插入到数组中 这就是我试图做的 首先是同步部分 public class MultiThreadedSum { private ArrayBuffer ArrayBufferInst; private int Sum; private boolean Flag; public MultiThreadedSum(ArrayBuffer ArrayBufferInst) { th

我有一个大小为n的数组,其中填充了数字1..n

我需要使用m个线程对这个数组求和,每次取两个元素,求和并将求和插入到数组中

这就是我试图做的

首先是同步部分

public class MultiThreadedSum {

private ArrayBuffer ArrayBufferInst;
private int Sum;
private boolean Flag;

public MultiThreadedSum(ArrayBuffer ArrayBufferInst)
{
    this.ArrayBufferInst = ArrayBufferInst;
    Sum = 0;
    Flag = false;
}

public synchronized void Sum2Elements()
{

    while(Flag)
    {
        try {wait();}
        catch (InterruptedException e){}
    }

    Flag = true;

    if (ArrayBufferInst.RetunrSize() < 2)
    {
        return;
    }

    System.out.println("Removing 2 elements.");

    Sum = ArrayBufferInst.Sum2Elements();

    notifyAll();
}

public synchronized void InsertElement()
{

    while(!Flag)
    {
        try {wait();}
        catch (InterruptedException e){}
    }

    Flag = false;

    System.out.println("Inserting the sum.");

    ArrayBufferInst.InsertElement(Sum);

    notifyAll();
}

public int RetunrSize()
{
    return ArrayBufferInst.RetunrSize();
}

}
以下是主要问题的一部分:

ArrayBufferInst = new ArrayBuffer(n);

MultiThreadedSumInst = new MultiThreadedSum(ArrayBufferInst);

ExecutorService Threads = Executors.newCachedThreadPool();

for (i = 0; i < m/2; i++)
{
    Threads.execute( new Sum2ElementsThread(MultiThreadedSumInst) );
}

for (; i < m; i++)
{
    Threads.execute( new InsertThread(MultiThreadedSumInst) );
}

while (MultiThreadedSumInst.RetunrSize() > 1){}

Threads.shutdown();
ArrayBufferInst=新的ArrayBuffer(n);
MultiThreadedSumInst=新的多线程总和(ArrayBufferInst);
ExecutorService线程=Executors.newCachedThreadPool();
对于(i=0;i1){}
Threads.shutdown();
缓冲区呢

public class ArrayBuffer {

    private ArrayList<Integer> ArrayBufferInst;

    public ArrayBuffer(int SizeOfBuffer)
    {
        int i;

        ArrayBufferInst = new ArrayList<>(SizeOfBuffer);

        for (i = 0; i < SizeOfBuffer; i++)
        {
            ArrayBufferInst.add(i, i+1);
        }
    }

    public int Sum2Elements()
    {
        if (ArrayBufferInst.size() < 2)
        {
            return -1;
        }

        return ArrayBufferInst.remove(0) + ArrayBufferInst.remove(1);
    }

    public void InsertElement(int Elem)
    {
        ArrayBufferInst.add(Elem);
    }

    public int RetunrSize()
    {
        return ArrayBufferInst.size();
    }
}
公共类ArrayBuffer{
私人ArrayList ArrayBufferInst;
公共阵列缓冲区(int SizeOfBuffer)
{
int i;
ArrayBufferInst=新的ArrayList(SizeOfBuffer);
对于(i=0;i
我收到了很多java.lang.IndexOutOfBoundsException和RangeCheck错误,这可能与我实现Sum2元素的方式有关,但我不确定

有人帮忙吗


谢谢。

当在ArrayList
{a,b,c}

    if (ArrayBufferInst.size() < 2)
    {
        return -1;
    }

    return ArrayBufferInst.remove(0) + ArrayBufferInst.remove(1);
if(ArrayBufferInst.size()<2)
{
返回-1;
}
返回ArrayBufferInst.remove(0)+ArrayBufferInst.remove(1);

然后
ArrayBufferInst.remove(0)
将删除并返回
a
,将
ArrayBufferInst
更改为
{b,c}
。调用
ArrayBufferInst.remove(1)
将删除c,这不是您想要的。因此,只需将1改为0。

您真的需要一次将它们相加两次,然后继续将总和重新添加到数组中吗?实现这一点的一般方法是将输入数组分解为m个块,并让每个线程汇总自己的独立块,然后将这些结果合并为一个块(通常使用超立方体顺序-)。我想知道这种使用一个线程一次添加两个数字的方法是否真的比较慢?使用多个线程的全部目的是让代码运行得更快。我会确保这比简单的单线程循环更快。如果不是,那就是浪费时间和精力。嗯,这是一项任务。。。谢谢
    if (ArrayBufferInst.size() < 2)
    {
        return -1;
    }

    return ArrayBufferInst.remove(0) + ArrayBufferInst.remove(1);