如何在Java中构建一个非常简单的多线程管道?

如何在Java中构建一个非常简单的多线程管道?,java,multithreading,java-threads,Java,Multithreading,Java Threads,我试图在多线程管道中的矩阵上运行一些过滤器,以节省一些时间。遗憾的是,我还没有完全理解一些明显的同步问题 我所期望的是,我可以将一个矩阵输入到我的step()函数中,并接收一个包含所有过滤器的矩阵(由管道长度延迟) 另外,对于一些额外的(可能是不必要的)信息,我在applyMedFilter中以一种可能滥用的方式使用并行(我真的不认为这会导致问题,但是…): ArrayList行索引=新建ArrayList(); for(int i=kernel;i{ 对于(int j=kernel;jstag

我试图在多线程管道中的矩阵上运行一些过滤器,以节省一些时间。遗憾的是,我还没有完全理解一些明显的同步问题

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

另外,对于一些额外的(可能是不必要的)信息,我在applyMedFilter中以一种可能滥用的方式使用并行(我真的不认为这会导致问题,但是…):

ArrayList行索引=新建ArrayList();
for(int i=kernel;i{
对于(int j=kernel;j
我不规则地从只应用了一些过滤器的函数中得到一个矩阵;尤其是有时不应用applyMedFilter,这是不可能发生的。事实上,有时一切正常,有时又不正常,这让我得出结论,这可能是一个缓存一致性问题。 另外,注释掉applyArtifactFilter似乎可以解决问题


为什么这不能像我期望的那样工作?我怎样才能做得更好?

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

您似乎有两个线程同时修改相同的矩阵。那肯定会引起问题……你也一样。这很难理解,因为你有4个不同的矩阵变量,而且你似乎在奇怪地分配它们。还有线程中无用的空检查是怎么回事?…最后,请记住
volatile
变量数组与
volatile
变量数组不同。希望不是!预期的工作流是:res=stage2matrix->stage2matrix=filtered(stage1matrix)->stage1matrix=filtered(inputmatrix),这应该使其成为管道,还是不?此外,在我的心智模型中,volatile甚至不应该是必需的,我只是为了安全起见才添加了它,我想:/此外,为了代码的清晰性,删除了null检查!
    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
    }
}
        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]);
            }
        });
    }