是否有一个``arrayAdd``方法或什么来促进数组添加?

时间:2018-02-15 10:11:49

标签: java arrays matrix addition

所以我有一个数组

static final int N = maxNofActiveThreads;
static final int[]arr = new int[N*nofEntries];

N个线程写入数组的互斥区域。

我现在想添加一个监控线程,通过简单地总结所有线程来定期收集决策结果。表。

即。在伪代码中

int[] snapshot = arr[0 : nofEntries] + arr[nofEntries : 2*nofEntries] + ... + arr[(N-1) * nofEntries : N*nofEntries]

显而易见的选择是简单地创建

int[] snapshot = new int[nofEntries]
System.arrayCopy(arr,0,snapshot,0,nofEntries);

然后浏览arr的其余部分,一次添加一个值。

是否有更聪明/更有效的方式?

哦,如果我们经常错过更新,我们就不在乎,它最终会出现在下一个传递中,那很好。无需任何同步。

(我还应该提到我正在进行的项目要求我使用Java 7.)

1 个答案:

答案 0 :(得分:0)

我能想象的最好的方法是使用Arrays类静态方法parallelSetAll。在尝试并行化操作时,它可能更有效。另一个并行方法的Javadoc说:

  

...对于大型数组,计算通常比顺序循环更有效。

所以你可以使用:

private int tsum(int index) {
    int val = 0;
    for (int t=0; t<N; t++) {
        val += arr[index + t * nofEntries];
    }
    return val;
}

    IntUnaryOperator generator = (x) -> tsum(x) ;
    int[] snapshot = new int[nofEntries];
    Arrays.parallelSetAll(snapshot, generator);