2012-09-20 6 views
1

저는 프로듀서/소비자 문제를 시도했지만, 왜 소비자 내부에 java.lang.NullPointerException이되는지 알지 못합니다.소비자 내부에서 NullPointerException이 발생했습니다.

package com ; 

import java.util.concurrent.PriorityBlockingQueue; 

public class Producer extends CommonClass implements Runnable { 

    private int producerNum; 

    Producer(PriorityBlockingQueue<Character> queue) { 
     queue = queue; 
    } 

    public void run() { 

     char ch; 

     for (ch = 'a'; ch <= 'z'; ch++) { 
      queue.add(ch); 
      System.out.println("Producer" + producerNum + "produced :" + ch); 
      try { 
       Thread.sleep((int) (Math.random() * 300)); 

      } catch (InterruptedException e) { 
       System.out.println("Error"); 
      } 

     } 

    } 

} 

이이 내가 얻을 예외 내 소비자 클래스

package com ; 

import java.util.concurrent.PriorityBlockingQueue; 

public class Consumer extends CommonClass implements Runnable { 

    private int consumerNum; 

    Consumer(PriorityBlockingQueue<Character> queue) 
    { 
     queue = queue; 
    } 

    public void run() { 
     char c; 

     for (int i = 0; i < 27; i++) { 
      c = queue.poll(); 
      System.out.println("Consumer" + consumerNum + "consumed:" + c); 
      try { 
       Thread.sleep((int) (Math.random() * 300)); 
      } catch (InterruptedException e) { 
       System.out.println("Error"); 
      } 
     } 

    } 
} 

package com ; 

import java.util.concurrent.PriorityBlockingQueue; 

public class CommonClass { 

    PriorityBlockingQueue<Character> queue = new PriorityBlockingQueue<Character>(); 

} 

package com ; 

import java.util.concurrent.PriorityBlockingQueue; 

public class SyncTest { 

    public static void main(String[] args) { 



     PriorityBlockingQueue<Character> queue = new PriorityBlockingQueue<Character>(); 

     Producer p1 = new Producer(queue); 
     Thread t1 = new Thread(p1); 
     t1.start(); 

     Consumer c1 = new Consumer(queue); 
     Thread ct1 = new Thread(c1); 
     ct1.start(); 

    } 
} 

입니다 :

Exception in thread "Thread-1" java.lang.NullPointerException 
    at com.Consumer.run(Consumer.java:18) 
    at java.lang.Thread.run(Unknown Source) 
+0

_any_ 예외에 관한 질문을 게시 할 때 예외에서 처음 몇 줄을 게시하고 _specifically_에 예외 행이 참조하는 코드를 표시하십시오. – Gray

답변

7

이 바로 문제입니다. 당신이 원하는 :

Consumer(PriorityBlockingQueue<Character> queue) 
{ 
    this.queue = queue; 
} 

당신이 수정 한 후에는 다음 인해 큐가 비어있는 경우 null을 반환하는 (Queue에 decalred) poll()를 호출에 잠재적 인 문제가 있습니다 것을. 그런 다음 해당 null 참조가 인 c 변수에 값을 할당하기 위해 언 박싱됩니다.

대신 take() (BlockingQueue에 선언 됨)을 사용하면 차단됩니다. 타임 아웃도 지정할 수 있습니다.

+0

Jon Skeet에게 감사드립니다. PriorityBlockingQueue를 Threads의 소스로 사용한다면 질문이 하나 더 있습니다. 여전히 Consumer 및 Producer의 메소드를 기다리고 사용할 필요가 있습니까? – Pawan

+0

@PreethiJain : "스레드에 대한 소스"가 무엇을 의미하는지는 명확하지 않지만 API를 차단하는 일반적인 점은 다른 동기화를 사용하지 않아도된다는 것입니다. 그냥'offer'와'take'를 사용하십시오. –

+0

이것은 생산자와 소비자 스레드이므로, 각각 COnsumer 및 Producer에서 wait 및 notify 메소드를 사용해야합니까? – Pawan

3

Use take instead of poll 여론 조사는 반환 null로 할 수있다.

JavaDoc#poll()

큐의 선두, 또는 널 (null)이 큐에 추가하고 방법을 차단하고 get에 걸릴 사용 put

비어있는 경우. 그 자체로 다시 매개 변수의 값을 할당, 무 조작 문을의

Consumer(PriorityBlockingQueue<Character> queue) 
{ 
    queue = queue; 
} 

:

관련 문제