2012-01-21 324 views
3

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

即使ImageIO.write不是线程安全的,会以其他方式创建ImageWriter对象(为每个请求分配新的对象,假设可能)是线程安全的?我试过​​和ThreadLocal。两者都无法工作。

+2

为什么没有'synchronized'或'ThreadLocal'工作? – skaffman

+2

我瞥了一眼指南。它特别指出,该类的多个实例必须能够同时运行。所以,如果你有多个请求,创建多个实例 - 这就是它的设计工作方式 - 每个线程使用自己的实例。 –

回答

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

}

+0

啊,需要从池中获取/放入ImageWriter时进行同步。 – kaku