ImageIO可以使用多线程吗?

4

ImageIO指南明确表示线程安全不是目标。 特别是,ImageIO.write 看起来可能会缓存和重用 ImageWriter 对象,因此不是线程安全的。

即使 ImageIO.write 不是线程安全的,通过其他方式创建 ImageWriter 对象(为每个请求分配新对象,如果可能的话)是否是线程安全的?

我尝试过 synchronizedThreadLocal。 两者都无法正常工作。


2
为什么synchronized或者ThreadLocal没有起作用? - skaffman
2
我看了一眼指南。它明确表示该类的多个实例必须能够同时运行。因此,如果您有多个请求,请创建多个实例 - 这就是设计的工作方式 - 每个线程使用自己的实例。 - Martin James
1个回答

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);
}

}


啊,从池中获取/放置ImageWriter时需要同步。 - kaku

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接