이 문제는 우리가 원하는대로 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);
}
}
왜'synchronized' 또는'ThreadLocal' 작동하지 않았다? – skaffman
나는 가이드를 훑어 보았다. 특히 클래스의 여러 인스턴스가 동시에 작동 할 수 있어야합니다. 따라서 여러 개의 요청이있는 경우 여러 개의 인스턴스를 만들 수 있습니다. 즉, 각 스레드가 자체 인스턴스를 사용합니다. –