Эта проблема возникла из-за того, что мы не можем создавать объекты ImageWriter столько, сколько мы хотим, потому что они не могут уничтожить или утечь память.Поэтому я решил создать пул для ImageWriter.
Я написал очень маленький класс для управления пулом ImageWriter, как показано в следующем коде.* необходимо добавить случаи ошибок.
Я использовал этот пул с ExecutorService и Executors.newFixedThreadPool.Казалось, работает.
public class PooledImageWriter {
static List<ImageWriter> mPool = new ArrayList<ImageWriter>();
public PooledImageWriter(String formatName, int size) {
for(int i = 0; i < size; i++) {
mPool.add((ImageWriter)ImageIO.getImageWritersByFormatName(formatName).next());
}
}
ImageWriter get() {
if(mPool.isEmpty()) {
return null;
}
return mPool.remove(0);
}
void put(ImageWriter o) {
mPool.add(o);
}
public void write(BufferedImage image, File file) throws Exception {
ImageWriter writer = get();
ImageOutputStream ios = ImageIO.createImageOutputStream(file);
writer.reset();
writer.setOutput(ios);
writer.write(image);
ios.close();
put(writer);
}
}