首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多个线程调用的ImageIO.write,安全吗?

多个线程调用的ImageIO.write,安全吗?
EN

Stack Overflow用户
提问于 2017-05-22 18:21:07
回答 1查看 1.1K关注 0票数 1

关于从包ImageIO类编写javax.imageio类的方法,我有一个问题

我可以调用这个方法吗?

ImageIO.write(bufferedImage, 'jpg', new File(...))

对每个线程使用不同的bufferedImage实例

所以我想知道在我的情况下它是否是安全的。以及为什么这个方法可以是线程安全的。提前感谢!

编辑:@yshavit,是的,它是为了在不同的文件中写入

对于另一个线程,我读过它,但是我不太明白为什么它可以像haraldK所说的那样是线程安全的。

EN

回答 1

Stack Overflow用户

发布于 2017-05-22 22:28:06

我可以叫这个方法ImageIO.write(bufferedImage, 'jpg', new File(...))..。我想知道它是否安全..。

听起来,您正在尝试在具有不同bufferedImage的多个线程中调用bufferedImage,这些线程都是写入同一个File的。就“线程安全”的代码而言,这不会是一个问题。通过使用不同的bufferedImage从不同的线程调用,不会出现内存覆盖问题或我们通常担心的线程问题。

但是,存在可能生成无效图像文件的争用条件。在查看FileImageOutputStream时,如果两个线程同时写入同一个RandomAccessFile,那么当然可以获得由一个线程编写的文件部分,而另一个线程编写的其他部分则会导致图像中断。

我建议每个线程写入自己的临时文件,然后将文件重命名如下:

代码语言:javascript
复制
// write to temporary file with thread-id suffix
File tempFile =
     new File(destinationDirectory + fileName + Thread.currentThread().getId() + ".t");
ImageIO.write(bufferedImage, 'jpg', tempFile);
// rename into place
tempFile.rename(new File(fileName));

File.rename(...)方法是一个原子操作。它并不能拯救您,因为调用重命名的第二个线程将删除第一个线程的输出,但它会将您从损坏的图像中拯救出来。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44119617

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档