2012-01-21 2 views
3

ImageIO Guide конкретно заявляет, что безопасность потока является нецелевой. ImageIO.write, в частности, похоже, что он может кэшировать и повторно использовать объекты ImageWriter и, следовательно, не быть потокобезопасными.Может ли ImageIO быть многопоточным?

Даже если ImageIO.write не были потокобезопасными, создавали бы объекты ImageWriter каким-либо другим способом (выделяя новые для каждого запроса, если это возможно) быть потокобезопасными?

Я пробовал synchronized и 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

Ах, нужно синхронизировать, когда вы получаете/put ImageWriter из пула. – kaku