如何并行化for循环

时间:2016-11-13 11:14:24

标签: java image-processing parallel-processing java-stream

我尝试并行化 for for for循环,因为我想在 java 中使用并行流的代码STRONG>。问题是..每次我尝试这样做时,我都无法获得整个结果。我的意思是......这段代码应该以一定的角度旋转图像,但是如果我正在进行并行化,我只会收到一半图像旋转。

2 个答案:

答案 0 :(得分:0)

一个问题可能是在for循环之外声明的a,b,xx,yy变量。可能是不同的(交错的)迭代会覆盖这些变量的值。例如,

  1. 迭代0写入a和b
  2. 迭代0停止,迭代1开始并写入a和b
  3. 调度程序返回到迭代0,但a和b的值现在是迭代1的值。

答案 1 :(得分:0)

我认为这个实现存在一些问题。

1)来自parallelstream的每个线程都将覆盖另一个线程所做的ImageIo.write。

2)另外,forEach是无序的,所以你不知道哪一半会先发生。

我认为最好的办法是使用Stream API中的collect方法。如果您需要帮助,我可以提供一些代码。但是,如果您在问题中给我一个可测试的代码,我将编写并行收集操作。否则,一切顺利。

修改

我做了一些检查,发现你的rotateImage是罪魁祸首。该问题与parallelStream无关。每个点(x1,y1)需要很多转换,现在对我来说代码太多了。您的算法应该注意以下事项:

  1. 您需要计算图像的新高度和宽度 顺时针旋转90度你的destHeight = srcWidth和 反之亦然。
  2. 首先,你必须围绕原点旋转你的点 (x0,y0)
  3. 您不仅需要将您的点(x1,y1)转换为新的坐标系
    1. 这个新坐标系的原点位于图像的左上角,因此您不仅要旋转,还要将点转换为新的坐标系。
    2. 另外,请注意,在您编写的旋转方程式中,您可能假设x向右增加而y向顶部增加,但是当您将图像写入像素时,xx向右增加,但yy朝向底部(而不是顶部)。
  4. 一旦你完成了每个像素的所有翻译和旋转以及缓冲区的高度和宽度,在rotateImage函数中,我认为你可以在你的位置流上调用parallelStream函数,你就不会遇到问题。

    像OpenGL这样的一些库可以让你更轻松。它们负责用旋转矢量和平移矢量旋转和平移中心周围的每个像素矢量。