2017-05-22 73 views
1

我有一個關於方法問題寫ImageIO類的從javax.imageio中
我可以調用的方法
ImageIO.write(bufferedImage, 'jpg', new File(...))
與BufferedImage的不同情況爲每個線程
所以我想知道,如果它是包線程安全或不在我的情況。爲什麼這個方法可以是線程安全的。提前致謝!ImageIO.write由多個線程調用,是否安全?

編輯:@yshavit,是的,它是爲了在不同的文件
對於其他線程我讀它寫的,但我沒有很好理解爲什麼它可能是肯定的線程安全的,因爲haraldK說。

+0

我懷疑這是,但我不確定。一種常用的技術是寫入tmp位置,然後將其移動到您想要的位置 - 這通常是原子性的,或者像您要在給定的文件系統上那樣原子化。 – yshavit

+0

假設你不試圖寫入同一個文件 - 我不明白爲什麼這不會是線程安全的。 –

+0

啊,是的。我正在假設寫入同一個文件。 OP,你能澄清嗎? – yshavit

回答

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(...)方法一個原子操作。這並不能讓您免於調用重命名的第二個線程將刪除第1個線程的輸出,但它可以幫助您免受損壞的圖像。

+0

謝謝你的回答。在我的情況下,我沒有競態條件問題,因爲我將每個bufferedImage保存在不同的文件中。我的問題是關於兩個線程(或更多)在同一時間執行的ImageIO.write(...,...,...)方法 –

相關問題