并行流哈希集

时间:2018-06-24 23:25:54

标签: java parallel-processing java-stream hashset

我在Java 8中编程时遇到以下问题。HashSet“ mySet”通常包含数千个整数,这是我编程的瓶颈。它经常执行。加快速度可以缩短执行时间。

void doStuff(int val){
    for (int i : mySet) {
        if (val > limits)
            alpha = arrayA[i] + arrayB[val];
        else
            alpha = arrayK[i][val] + arrayA[i] + arrayB[val];

        if (cmpArray[i] > alpha) {
            cmpArray[i] = alpha;
            arrayC[i] = val;
        }
        if (alpha == 0) {
            zeroSet.add(i);
        }
    }
}

我试图使用并行流来使这项工作更快地完成:

void doStuff(int val){
    if (val > limits)
            mySet
           .parallelStream()
           .filter(p -> this.cmpArray[p] > -(arrayA[p] + arrayB[val]))
           .forEach(p -> op(p, val, -(arrayA[p] + arrayB[val])));
        else
            mySet
           .parallelStream()
           .filter(p -> this.alpha[p] > arrayK[p][val] - arrayA[p] - arrayB[val])
           .forEach(p -> op(p, val, arrayK[p][val] - arrayA[p] - arrayB[val]));

    for (int i : mySet()) { 
        if (arrayA[i] == 0) {
            zeroSet.add(i); 
        }
    }

void op(int p, int val, int alpha){
    cmpArray[p] = alpha;
    arrayC[p] = val;
}

我无法并行化HashSet-Function add()。这导致了一些奇怪的结果。谁能给我一个关键字,寻找什么以便了解发生了什么?甚至有机会并行处理此代码吗?

我不想让您为我解决问题,而只是检查我是否在正确的轨道上:-D

感谢您的答复。

最好,山姆

1 个答案:

答案 0 :(得分:0)

请注意,HashSet实现不是线程安全的。多线程添加元素会破坏数据集。

请参见documentation

为了并行化循环,必须创建一个新的Set。

替换

for (int i : mySet()) { 
    if (arrayA[i] == 0) {
        zeroSet.add(i); 
    }
}

使用

zeroSet = mySet
      .parallelStream()
      .filter(i -> arrs[i] == 0)
      .collect(Collectors.toSet());

希望这会有所帮助:)