如何使用Java构建非常简单的多线程管道?

我试图在多线程管道中的矩阵上运行一些过滤器,以节省时间。可悲的是,出现了一些同步问题,但我尚未完全解决。

期望的是,我可以将矩阵输入到step()函数中,并接收一个上面具有所有过滤器的矩阵(由管道长度延迟)。

    volatile private short[][] stage1matrix,stage2matrix;

    public short[][] step(short[][] matrix) {

        short[][] res = stage2matrix; // stage matrix with all applied filters for output
        stage2matrix = stage1matrix; // take matrix with applied stage 1 filters for stage 2
        stage1matrix = matrix; // stage input matrix for stage 1 filters

        Thread stage2 = new Thread(() -> {
            applyArtifactFilter(stage2matrix);
        });
        stage2.setPriority(10);
        stage2.start();

        Thread stage1 = new Thread(() -> {
            applySaltFilter(stage1matrix);
            applyLineFilter(stage1matrix);
            applyMedFilter(stage1matrix);
            applyPreArtifactFilter(stage1matrix);
        });
        stage1.start();

        try {
            stage1.join();
            stage2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        return res; // output matrix with all applied filters
    }
}

另外,对于一些其他(且可能是不必要的)信息,我正在以可恶的方式在applyMedFilter中使用并列(我并不认为这会导致问题,但是...):

        ArrayList<Integer> rowIndices = new ArrayList<Integer>();
        for (int i = kernel; i < matrix.length + kernel; i++) {
            rowIndices.add(i);
        }
        //   Move window through all elements of the image
        rowIndices.parallelStream().forEach(i -> {
            for (int j = kernel; j < matrix[0].length + kernel; j++) {
                // do some rowwise independent work in parallel
                   doSomeThingWith(matrix[i][j]);
            }
        });
    }

发生了什么事,我不定期地从仅应用了某些过滤器的函数中获取矩阵;尤其是有时候未应用applyMedFilter,这是不可能发生的。有时一切正常,有时不能正常运行的事实使我得出结论,这可能是缓存一致性问题。 另外,注释掉applyArtifactFilter似乎也可以解决问题。

为什么这不符合我的预期,我该如何做得更好?

cat2799 回答:如何使用Java构建非常简单的多线程管道?

发布的代码可以正常工作;错误是函数的输入,每次输入都是相同的矩阵,而不是副本,因此所有变量都引用相同的

本文链接:https://www.f2er.com/3118385.html

大家都在问