gpt4 book ai didi

java - ImageIO 可以是多线程的吗?

转载 作者:搜寻专家 更新时间:2023-11-01 03:55:20 24 4
gpt4 key购买 nike

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

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

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

最佳答案

这个问题来自We can't create ImageWriter objects as much as we want, because it can't dispose or leak memories。所以我决定为 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);
}

关于java - ImageIO 可以是多线程的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8953292/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com