【问题标题】:Could ImageIO be multi-threaded?ImageIO 可以是多线程的吗?
【发布时间】:2012-02-15 17:16:37
【问题描述】:

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

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

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

【问题讨论】:

  • 为什么synchronizedThreadLocal 不起作用?
  • 我看了一眼指南。它特别指出类的多个实例必须能够同时操作。因此,如果您有多个请求,请创建多个实例 - 这就是它的设计方式 - 每个线程都使用自己的实例。

标签: java multithreading javax.imageio


【解决方案1】:

这个问题来自于我们不能随心所欲地创建 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时需要同步。
猜你喜欢
  • 1970-01-01
  • 2011-05-08
  • 2011-04-19
  • 2013-03-08
  • 1970-01-01
  • 2014-12-16
  • 2019-02-11
  • 1970-01-01
  • 2020-04-14
相关资源
最近更新 更多