java多线程生成缩略图,避免内存溢出的例子
时间: 2023-08-12 21:58:20 浏览: 227
Java 多线程死锁的产生以及如何避免死锁
当处理大量图片生成缩略图时,如果不注意内存的管理,很容易导致内存溢出。以下是一个避免内存溢出的Java多线程生成缩略图的例子:
```java
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ThumbnailGenerator {
private static final int THREAD_POOL_SIZE = Runtime.getRuntime().availableProcessors();
public static void generateThumbnails(String[] imagePaths, String outputDirectory, int thumbnailWidth, int thumbnailHeight) {
ExecutorService executor = Executors.newFixedThreadPool(THREAD_POOL_SIZE);
for (String imagePath : imagePaths) {
executor.execute(() -> {
try {
generateThumbnail(imagePath, outputDirectory, thumbnailWidth, thumbnailHeight);
} catch (IOException e) {
e.printStackTrace();
}
});
}
executor.shutdown();
while (!executor.isTerminated()) {
// 等待所有任务完成
}
}
private static void generateThumbnail(String imagePath, String outputDirectory, int thumbnailWidth, int thumbnailHeight) throws IOException {
BufferedImage originalImage = ImageIO.read(new File(imagePath));
int type = originalImage.getType() == 0 ? BufferedImage.TYPE_INT_ARGB : originalImage.getType();
BufferedImage resizedImage = new BufferedImage(thumbnailWidth, thumbnailHeight, type);
Graphics2D g = resizedImage.createGraphics();
g.drawImage(originalImage, 0, 0, thumbnailWidth, thumbnailHeight, null);
g.dispose();
String outputFilePath = outputDirectory + File.separator + getFileName(imagePath);
ImageIO.write(resizedImage, "jpg", new File(outputFilePath));
}
private static String getFileName(String filePath) {
File file = new File(filePath);
return file.getName();
}
}
```
在这个例子中,我们使用了`ExecutorService`来创建一个固定大小的线程池。然后,我们遍历所有的图片路径,并将生成缩略图的任务提交给线程池进行处理。
在`generateThumbnail`方法中,我们使用`ImageIO.read`读取原始图片,并根据指定的宽度和高度创建一个新的缩略图。然后,我们将原始图片绘制到缩略图中,并将缩略图保存到指定的输出目录。
最后,在`generateThumbnails`方法中,我们等待所有任务完成后关闭线程池。
使用这个例子,你可以在处理大量图片生成缩略图时避免内存溢出。你可以调整线程池的大小来适应你的需求,并根据需要修改生成缩略图的逻辑。
阅读全文