ImageIO Guide明確指出線程安全是非目標。特別是,它看起來像它可能會緩存和重用ImageWriter
對象,因此不是線程安全的。ImageIO可以是多線程的嗎?
即使ImageIO.write
不是線程安全的,會以其他方式創建ImageWriter
對象(爲每個請求分配新的對象,假設可能)是線程安全的?我試過和ThreadLocal
。兩者都無法工作。
ImageIO Guide明確指出線程安全是非目標。特別是,它看起來像它可能會緩存和重用ImageWriter
對象,因此不是線程安全的。ImageIO可以是多線程的嗎?
即使ImageIO.write
不是線程安全的,會以其他方式創建ImageWriter
對象(爲每個請求分配新的對象,假設可能)是線程安全的?我試過和ThreadLocal
。兩者都無法工作。
這個問題來自我們不能像我們想要的那樣創建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);
}
}
啊,需要從池中獲取/放入ImageWriter時進行同步。 – kaku
爲什麼沒有'synchronized'或'ThreadLocal'工作? – skaffman
我瞥了一眼指南。它特別指出,該類的多個實例必須能夠同時運行。所以,如果你有多個請求,創建多個實例 - 這就是它的設計工作方式 - 每個線程使用自己的實例。 –