2011-10-20 4 views
2

나는 하나의 스레드를 가지고 있는데, 그 스레드는 tcp 패킷을 받고 각각의 라인을 ArrayList<String> 인 버퍼에 추가한다. 다른 스레드는 버퍼가 현재 잠겨 있지 않은 경우에만 새 데이터를 사용할 수 있는지 정기적으로 확인해야합니다. 하지만 잠겨 있는지 어떻게 확인합니까? C++에서는 명시 적으로 뮤텍스를 잠글 수 있습니다. 자바 : 동기화 된 버퍼

는 내가하고 싶은 무엇의 일부 의사 코드 :

while(buffer.isLocked()) 
{ 
    buffer.wait(); 
} 

buffer.lock(); 
buffer.add(tcpPacket); 
buffer.unlock(); 
buffer.notify(); 

이 지금까지 내 자바 코드 :

void process(String tcpPacket) 
{ 

    synchronized(buffer) 
    { 
     buffer.add(tcpPacket); 
    } 
    buffer.notify(); 
} 

답변

9

그것은 표준 생산자 - 소비자 문제입니다. JDK는 이것을 원활하게 처리하기 위해 ArrayBlockingQueue을 제공합니다.

0

이 경우 파이프 사용을 고려할 수도 있지만 (PipedInputStream과 PipedOutputStream)을 사용하고 블로킹 IO 메소드를 사용하여 패킷이 도착할 때 스레드가 올바르게 깨어나도록 보장하십시오. 이것은 "공유 버퍼"문제에 대한 훨씬 간단한 접근 방법입니다.

+0

파이프가 채워지면 제작자가 차단됩니다. 이 파이프로 연결된 시내는 가치가있는 것보다 훨씬 어려움이 있습니다. – EJP

+0

실제로 IO 작업에 바람직한 동작인지 여부는 의문입니다. 즉, 소비자 스레드를 오버런하지 않으려 고합니다 (소비자가 제작자를 따라갈 수없는 경우 무제한 대기열이 많은 메모리를 소비하게됩니다). 어떤 시점에서 파이프가 채워지는 경우 프로듀서 스레드의 IO를 차단하면 메모리 사용이 무기한 증가하지 않도록하고 버퍼가 가득 차면 소비자 스레드가 우선 순위를 갖도록하는 좋은 방법입니다. – user268396

+0

나는 개인적으로 하나의 스레드 만 가지며 TCP가 실제로 보낸 사람을 차단하도록합니다. 나는이 두 단계 디자인에 대한 열정을 결코 이해할 수 없다. 독서 과정은 소비자이고 쓰기 과정은 생산자입니다. 그걸 복제 할 필요가 없습니다. – EJP