2011-01-15 7 views
2

하나의 파일에서 블록을 읽어야하는 응용 프로그램을 작성하고 있습니다. 각 블록은 대략 512 바이트입니다. 또한 블록을 동시에 작성해야합니다.Java에서 스레드를 사용하여 파일을 읽고 쓰려면 어떻게해야합니까?

내가 가진 아이디어 중 하나는 BlockReader implements Runnable이고 BlockWriter implements RunnableBlockManager은 리더와 작가 모두를 관리합니다.

내가 발견 한 대부분의 예제에서 볼 수있는 문제는 잠금 문제와 잠재적 교착 상태입니다. 어떤 아이디어를 구현하는 방법?

+2

어떤 경우 든 비 연속적으로 작성하면 성능이 저하됩니다. 나는 하나의 작업자 (쓰는) 쓰레드로 블로킹 큐 솔루션이 더 나은 성능과 덜 두통을 줄 것이라고 생각한다. ... – extraneon

+0

@extraneon 대답과 주석이 아니어야한다.) – WarmWaffles

+0

명확성을 위해서 - 동시 작성은 요구 사항을 충족시키지 않거나 완료되면 데이터를 덤프 할 수있는 스레드를 생성하는 데이터로만 전환하여 다른 블록을 처리 할 수 ​​있습니까? – extraneon

답변

3

이 경우 책 java Concurrency in Practice (이 경우에는 5.3 (생산자 - 소비자 패턴))을 권하고 싶습니다.

BlockingQueue<Data> queue = 
    new LinkedBlockingQueue<Data>(MAX_BLOCKS_IN_QUEUE_UNTIL_BLOCK); 

for (int i=0; i < MAX_DATA_PRODUCERS; i++) { 
    new Thread(new DataProducer(queue)).start(); 
} 

new Thread(DataWriter(queue)).start 

은 분명히 DataProducer 및 DataWriter가보다 Runnable 있습니다

솔루션은 같은 것을 볼 수 있었다.

class DataProducer implements Runnable { 
    ... 
    queue.put(data); // blocks if MAX_BLOCKS_IN_QUEUE_UNTIL_BLOCK 
        // are waiting to be written 
        // This prevents an OutOfMemoryException 
    ... 
} 

class DataConsumer implements Runnable { 
    ... 
    try { 
     while(true) { 
      writeData(queue.take()); // blocks until there is a block of data 
     } 
    } catch (InteruptedException e) { 
     Thread.currentThread().interrupt(); 
    } 
    ... 
} 
1

예를 들어 잠금 배열을 가질 수 있습니다. 32를 사용하고 블록 색인을 해시로 사용하여 얻을 수있는 잠금을 결정합니다. 이렇게하면 동시 읽기/쓰기 (대부분의 경우)를 수행 할 수 있으며 여러 스레드에서 동일한 블록을 읽거나 쓰지 않아도됩니다.

+0

나는 작동 할 것이라는 데는 의심의 여지가 없지만 필요한 검색을 통해 하나의 파일을 동시에 작성하는 것이 효율적이지는 않다고 생각합니다. 소비자는 더 낫지 만 또 다른 의견을 듣고 싶습니다. – extraneon

+0

동일한 성능을 얻을 수 있어야합니다. PC 모델이 더 나은 디자인을 선택했을 수 있습니다. –

관련 문제