ImageIO可以是多线程的吗?

时间:2012-01-21 13:22:22

标签: java multithreading javax.imageio

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

即使ImageIO.write不是线程安全的,也会以某种其他方式创建ImageWriter个对象(为每个请求分配新的对象,假设可能)是线程安全的?

我曾尝试synchronizedThreadLocal。两者都行不通。

1 个答案:

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

}