2012-01-21 36 views
3

ImageIO Guide明確指出線程安全是非目標。特別是,它看起來像它可能會緩存和重用ImageWriter對象,因此不是線程安全的。ImageIO可以是多線程的嗎?

即使ImageIO.write不是線程安全的,會以其他方式創建ImageWriter對象(爲每個請求分配新的對象,假設可能)是線程安全的?我試過​​和ThreadLocal。兩者都無法工作。

+2

爲什麼沒有'synchronized'或'ThreadLocal'工作? – skaffman

+2

我瞥了一眼指南。它特別指出,該類的多個實例必須能夠同時運行。所以,如果你有多個請求,創建多個實例 - 這就是它的設計工作方式 - 每個線程使用自己的實例。 –

回答

0

這個問題來自我們不能像我們想要的那樣創建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); 
} 

}

+0

啊,需要從池中獲取/放入ImageWriter時進行同步。 – kaku

相關問題