2012-01-21 1 views
3

ImageIO Guide은 스레드 안전이 목적이 아니라는 것을 명시합니다. 특히 ImageIO.write은 캐시하고 재사용 할 수있는 것처럼 보이며 따라서 스레드로부터 안전하지 않습니다.ImageIO가 멀티 스레드 일 수 있습니까?

ImageIO.write이 스레드로부터 안전하지 않더라도개체가 다른 방법으로 생성 될 수 있습니다 (가능한 경우 각 요청마다 새 할당). 스레드로부터 안전할까요?

나는 synchronizedThreadLocal을 시도했다. 둘 다 작동하지 못했습니다.

+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