Может ли ImageIO быть многопоточным? - PullRequest
4 голосов
/ 21 января 2012

В руководстве ImageIO конкретно указано, что безопасность потоков не является целью.В частности, ImageIO.write выглядит так, как будто он может кэшировать и повторно использовать ImageWriter объекты и, следовательно, не является поточно-ориентированным.

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

Я пробовал synchronized и ThreadLocal.Оба не могли работать.

1 Ответ

0 голосов
/ 09 марта 2013

Эта проблема возникла из-за того, что мы не можем создавать объекты 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);
}

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...