2012-04-13 7 views
1

에서 나는 다음과 같은 코드를 작성했지만, 내가 잘못 어딘가에 갈거야 느낌 : 여기생산자 소비자 자바

public class ProcessQueue { 

static BlockingQueue<String> queue = new LinkedBlockingQueue<String>(); 

public ProcessQueue() { 
    process(); 
} 

public void add(String message) throws InterruptedException { 
    System.out.println("Added Queue size:" + queue.size()); 
    System.out.println("Locked by Producer"); 
    queue.put(message); 
    System.out.println("Lock Released by Producer"); 
} 

public static void process() { 
    new Thread() { 

     @Override 
     public void run() { 
      try { 
       while (true) { 
        System.out.println("Locked by Consumer"); 
        Message.send(queue.take()); 
        System.out.println("Locked Released by Consumer"); 
        System.out.println("Consuming Queue size:" + queue.size()); 
       } 
      } catch (Exception ex) { 
       System.out.print(ex.getMessage()); 
      } 
     } 
    }.start(); 
} 
} 

추가 (문자열) 큐에 문자열을 추가합니다. UDP 포트에서 입력을 수신 할 때마다 호출됩니다. process()는 큐를 처리하여 처리를 위해 Message 클래스에 보냅니다. 출력물 Locked and Released Print Statements가 원하는 순서대로 아닙니다.

편집

내 예상 답변을해야한다 : 그 다음 프로듀서에 의해 잠겨 추가 할됩니다 프로듀서에 있다면 -> 잠금 해제 ->를 다음 대기열에 추가합니다. 소비자도 마찬가지입니다. 그러나 작업은 인터리브하지 않아야합니다. 즉, 일단 생산자가 잠그면 소비자가 인쇄 한 다음 인쇄물을 잠그지 않아야합니다.

+0

예상 및 실제 주문은 무엇입니까? – mfrankli

+0

원하는 순서와 인쇄 순서는? – Shehzad

+0

@mfrankli 편집자 섹션 –

답변

3

차단이 발생하는 유일한 시간은 대기열이 비어있는 경우입니다. 그렇지 않으면 puts가 계속 발생합니다. 따라서 대기열의 크기가 1 씩 증가하지 않는 것을 볼 수 있습니다. LinkedBlockingQueue에 바운드를 넣을 수 있습니다. 참고로 LBQ이 편집에 따라 기본 무제한의

편집은 다음과 같습니다

내 대답은 지금까지 당신이 보는 이유는 무엇 설명한다. 동기 메시징 전달 대기열을 찾고 있습니다. 다음으로이 작업을 수행 할 수 있습니다

new SynchrnousQueue(); 
new LinkedBlockingQueue(1); 
new ArrayBlockingQueue(1); 
new TransferQueue(); 

SynchrnousQueue이 정확하게 당신이 원하는 않습니다. Linked & ArrayBlockingQueue의 바인딩이 1 인 경우 거의 같습니다. TransferQueue는 스레드가 획득 할 준비가 될 때까지 대기하는 transfer 메소드를 가진 Java 7에서 제공되는 새로운 대기열입니다.

+0

을 참조하십시오. 이는 생산자 소비자 문제에 대한 위의 코드가 정확한 것을 의미합니까? –

+1

예, 단일 생산자 단일 소비자의 경우 –

+0

괜찮습니다. 그건 내 현재의 문제를 해결할 것입니다. 여러 제작자 또는 소비자와 함께 작동하도록하려면 어떻게해야합니까? –