2016-11-13 181 views
0

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

+0

你为什么不告诉我们的并行代码不起作用? – Eran

+0

我已经加我的主,我的函数现在 – cavaler12345

+0

你应该添加您的代码:)) –

回答

0

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

  1. 迭代0写入a和b
  2. 迭代0停止和迭代1开始写a和b
  3. 调度追溯到迭代0,但是一个和b的值现在是来自迭代1的那些。
+0

不,这不是......我已经把这个变量我的脑海中并...没有发生 – cavaler12345

+0

我的意思是,这是同样的错误的结果 – cavaler12345

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增加底部(而不是顶部)。

一旦你照顾这一切的平移和旋转每个像素随着缓冲区的高度和宽度,在rotateImage功能,我想你可以叫上你的位置parallelStream功能流和你不会有问题。

,比如OpenGL一些库可以为你做这个很容易。他们负责旋转和翻译中心周围的每个像素矢量与旋转矢量和平移矢量。

+0

以及..ķ给我一次,我会编辑自己的帖子 – cavaler12345

+0

K,我有你需要的一切职务。如果你能够为我并联,我会很高兴。 :D – cavaler12345

+0

当然让我试试。嗯。没有足够的代码,使其可编译...无论如何,你能以最低的就给1)指令文件,看看你的学历和旋转,也rotateImage功能呢?不知道问题是否在rotateImage函数中。 –