所以我有一个数组
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.)
答案 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);