2016-11-13 137 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函數中。 –