这是一个非常有趣的问题,因为它有很多优化点。
关于生成一个较小的图像然后生成缩略图的想法可能是一个很好的想法,但我要说的第一件事是,如果你有一个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个内核,而不需要进一步的并行处理。
最后一点需要注意的是,当您重新调整图像尺寸时,一旦拥有了中间图像,您可以将之前的图像设置为空以方便垃圾收集,这意味着当您生成缩略图时,内存,而不是原来的大尺寸。