這是一個非常有趣的問題,因爲它有很多優化點。
關於生成一個較小的圖像然後生成縮略圖的想法可能是一個很好的想法,但我要說的第一件事是,如果你有一個75MB的圖像,那麼它顯然比1024x768大得多 - 最有可能的幾倍在這種情況下,您希望確保使用SCALE_FAST縮放圖像(Image)。你想要實現的是縮放比例縮小圖像,通過丟棄像素而不是嘗試做更好看的(並且更昂貴的)區域平均等任何事情。您甚至可以通過抓住圖像的int []並對每個第N個元素進行採樣,以便爲新圖像創建一個新的int [],並以某種因子縮小比例,從而使其更快。
在這一點上,你將有一個較小的圖像,說2000年大約2000年。然後,你可以採取該圖像和縮放它使用更好的尋找像SCALE_SMOOTH實際縮略圖。
我會說,你應該而不是如果可能的話(無論如何處理)寫入磁盤。如果你可以在內存中執行操作,它將會更快,並且在並行性的情況下是非常重要的。除非您的服務器正在運行SSD,然後同時運行兩個磁盤繁重的操作(例如其中兩個圖像被同時重新縮放或者一個圖像被重新縮放到兩個不同的大小)將會強制磁盤出現顛簸(因爲主軸一次只能讀取一個流)。然後,你將受到你尋求時間的控制,你很快就會發現,連續化所有的操作將比一次完成多個操作要快得多。
我會說他們在內存中重新調整它們,然後將它們寫入(同步)到ArrayList,然後讓另一個線程順序讀取這些圖像並存儲它們。如果你不知道我在說什麼,然後看看我的回答另一個問題在這裏:
Producer Consumer solution in Java
這樣你parallelise其中的有用(CPU運算)和你做的文件順序寫入(避免顛簸)。
話雖如此,你需要問自己,如果並行將會使你受益。你的服務器是否有多個CPU /內核?如果不是,那麼這是毫無意義的,你應該不會打擾任何東西,因爲它只會讓你失去時間。
此外,如果您希望一次上傳很多這些圖像,那麼您可能不需要平行處理每個圖像,因爲您將最終獲得多個網絡服務器線程,每個線程最多處理一個圖像的時間,無論如何,這將爲您在多個核心上提供良好的CPU利用率。例如,如果您期望在任何時候都會有4個圖像不斷上傳,那麼這將使用4個內核,而不需要進一步的並行處理。
最後一點需要注意的是,當您重新調整圖像尺寸時,一旦擁有了中間圖像,您可以將之前的圖像設置爲空以方便垃圾收集,這意味着當您生成縮略圖時,內存,而不是原來的大尺寸。