ImageIO Guide明确指出线程安全是非目标。特别是ImageIO.write
看起来可能会缓存和重用ImageWriter
个对象,因此不是线程安全的。
即使ImageIO.write
不是线程安全的,也会以某种其他方式创建ImageWriter
个对象(为每个请求分配新的对象,假设可能)是线程安全的?
我曾尝试synchronized
和ThreadLocal
。两者都行不通。
答案 0 :(得分:0)
这个问题来自于我们无法根据需要创建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);
}
}