我对javax.imageio包中的ImageIO类的 write 方法有疑问
我可以打电话给方法
ImageIO.write(bufferedImage, 'jpg', new File(...))
与bufferedImage每个线程的不同实例
所以我想知道它的线程是否安全在我的情况下。为什么这个方法可以是线程安全的。提前谢谢!
编辑:@yshavit,是的,是为了写入不同的文件
对于我读过的另一个帖子,但是我并不十分清楚为什么它可以确保线程安全,因为 haraldK 说。
答案 0 :(得分:1)
我可以调用方法
ImageIO.write(bufferedImage, 'jpg', new File(...))
... 我想知道它是否是线程安全的......
听起来你试图在不同ImageIO.write(...)
的多个帖子中调用bufferedImage
,并写入同一个File
。就代码是"线程安全而言,这不会成为一个问题。通过使用不同的bufferedImage
从不同的线程调用,不会出现内存覆盖问题或我们通常担心线程的其他问题。
但是,存在可能生成无效图像文件的竞争条件。在查看FileImageOutputStream
时,如果2个线程同时写入同一个RandomAccessFile
,您当然可以获得由一个线程写入的文件的部分,而另一个线程写入的其他部分导致破碎的图像。
我建议每个线程写入自己的临时文件,然后将文件重命名到位:
// 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(...)
方法是原子操作。它不能避免这样一个事实,即调用重命名的第二个线程将删除第一个线程的输出,但它会使您免于损坏的图像。