2012-02-17 1 views
0

일부 이미지 파일의 크기를 조정해야하는 멀티 스레드 응용 프로그램이 있다고 가정 해 보겠습니다. 다중 스레드가 같은 시간에 동일한 이미지의 크기를 조정하고 서로의 결과를 덮어 쓰고 파일을 손상시키지 않도록하고 동시성을 최대화하기 위해 여러 스레드가 동시에 여러 이미지의 크기를 조정할 수 있기를 원합니다.Java에서 이미지 파일의 크기를 조정할 때 동시성 최대화

스레드가 단순히 전체 코드 블록을 동기화하는 대신 특정 이미지에 대한 잠금을 얻는 최상의 방법은 무엇입니까?

+0

"이미지"가 의미하는 바가 꽤 모호합니다. 파일? 힙의 Image 인스턴스 – Durandal

+0

나는 그가 힙을 의미한다고 생각하고있다. – Adrian

+0

나는 파일을 의미한다. 궁극적으로 스레드 A가 스레드 B의 결과를 덮어 써서 A가 끝나고 파일이 손상되기를 원하지 않는다. 나는 그 질문을 수정할 것이다. – 3urdoch

답변

2
  • 고정 된 스레드 ExecutorService을 사용하고 모든 이미지를 처리 ​​할 서비스에 제출하는 스레드가 있어야합니다. 동일한 이미지를 두 번 제출하지 않으면 문제가 발생하지 않습니다.

  • 다른 스레드가 사용하기 위해 "todo"BlockingQueue을 제공하는 스레드가있을 수도 있습니다. 그래서 당신은 스레드가 어떤 이미지를 제어 하는지를 제어하는 ​​하나의 스레드를 가지므로 필요한 잠금 장치가 없습니다.

  • 또 다른 방법은 ConcurrentHashMap을 사용하고 각 스레드를 putIfAbsent으로 설정 한 다음 작동하는 경우에만 이미지를 소비하는 것입니다. 이미지가 메모리에 있고 당신이 1 개 CPU가있는 경우

    if (concurrentMap.putIfAbsent(imagePath, null) == null) { 
        // do the processing 
        // either remove it from map when done or leave it to stop future processing 
    } 
    // I guess loop around and look at the next image 
    
+0

크기를 조정할 이미지를 요청하는 스레드를 제어 할 수 없으므로 많은 정보가있을 것입니다. 그래서 ConcorrentHashMap 기술을 사용하는 것이 유일한 방법이라고 생각합니다. 이것은 이미 내가 생각했던 것이므로 귀하는 저를 위해 그것을 확인했습니다. – 3urdoch

+0

멀티 쓰레드를 고집한다면 1이나 3을 쓰겠습니다. 2는 확장 가능하지 않습니다. 거의 틀림없이 1은 잘 확장되지 않습니다. – Adrian

+0

# 2가 확장 가능하지 않은 이유는 무엇입니까? @Adrian? 그것은 대략'ExecutorService'가하는 일입니다. – Gray

-1
  • , 1 실 만 사용합니다. 블록 된 대기 또는 다른 지연이 없으므로 스레드 간 컨텍스트 전환 지점이 없습니다.
  • n 개의 CPU를 사용하는 경우 1 개의 스레드/CPU를 사용할 수 있습니다.
  • 이미지가 RAID와 같은 다른 드라이브에있는 경우, 1 개의 스레드/드라이브를 병렬로로드하고 1 개의 스레드를 사용하여 크기 조정을 수행 할 수 있습니다. 생산자 소비자 패러다임을 사용할 수 있습니다.

편집 : 그냥 내 의견
에 대한 응답을 보았다 - 이미지를 디스크에 파일이 이미지 디스크에서 처리에 대한 및 1 스레드를 읽어 1 실을 사용하기 때문에. 이미지 크기를 조정한다고해서 파일을 찾고로드하는 데 HDD 대기 시간보다 오래 걸리지는 않습니다.

관련 문제