2012-02-22 3 views
-2

Нужно ли добавлять какие-либо пакеты для успешного выполнения кода ниже? Я получаю ошибки в коде, который мне не удалось исправить, особенно со ссылкой на ключевое слово synchronized. Может ли кто-нибудь указать, что я делаю неправильно? Спасибо.Продюсер/потребитель, использующий многопоточность в Java

объект данных:

class Q 
{ 
    int n; 
    boolean valueset=false; 

    synchronized int get() 
    { 
     if(!valueset) 

      try 
      { 
       wait(); 
      } 
      catch(InterruptedException e) 
      { 
       System.out.println("Interrupted Exception Caught."); 
      } 


      System.out.println("Got:"+n); 
      valueset=false; 
      notify(); 
      return n; 

    } 

    synchronized void put(int n) 
    { 
     if(valueset) 

      try 
      { 
       wait(); 
      } 
      catch(InterruptedException e) 
      { 
       System.out.println("Interrupted Exception Caught."); 
      } 

      this.n=n; 
      valueset=true; 
      System.out.println("Put:"+n); 
      notify(); 

    } 
} 

Производитель:

class Producer implements Runnable 
{ 
    Q q; 
    Producer(Q q) 
    { 
     this.q=q; 
     new Thread(this,"Producer").start(); 
    } 

     public void run() 
     { 
      int i=0; 
      while(true) 
      { 
       q.put(i++); 
      } 
     } 

} 

Потребитель:

class Consumer implements Runnable 
{ 
    Q q; 
    Consumer(Q q) 
    { 
     this.q=q; 
     new Thread(this,"Consumer").start(); 
    } 

     public void run() 
     { 
      while(true) 
      { 
       q.get(); 
      } 
     } 

} 

Экстра класс:

class PCfixed 
{ 
    public static void main(String[] args) 
    { 
     Q q=new Q(); 
     new Producer(q); 
     new Consumer(q); 

     System.out.println("Press Control-C to stop."); 
    } 
} 
+1

* Я получаю ошибки *: какие ошибки? –

+0

Какие ошибки вы получаете? Пожалуйста, отредактируйте свой вопрос, чтобы показать текст исключений и, по крайней мере, первые строки строки stacktrace. – Gray

+0

Не хотите, чтобы 'wait()' находился в 'if (valueset)'. Если значение было потреблено, то следующий put должен установить 'n' правильно? Это не должно быть в блоке 'if()', который я не думаю. То же самое с 'get()'. – Gray

ответ

0

Возможно, невозможно будет ответить правильно без дополнительной информации, но следующая проблема определенно (хотя может и не быть тем, с чем вы сталкиваетесь):
Вы не звоните wait() в цикле! javedocs ясно указывает

... приложения должны защищать против него путем тестирования при условии, что должно было привести нить к пробуждению, и продолжает ждать , если условие не выполнено. Другими словами, всегда ждет должно происходить в петлях ...

Более подробную информацию можно найти в этом thread

+0

_Certainly_ _agreed_ в принципе, но поскольку есть только один потребитель, я не думаю, что это проблема в этом случае. – Gray

+0

Для вашего развлечения см. Неправильный принятый ответ здесь: http://stackoverflow.com/questions/2960581/why-does-java-util-concurrent-arrayblockingqueue-use-while-loops-instead-of-i – Gray

0

В обоих Producer и Consumer, вы пытаетесь определить метод public void run()внутри в конструктор. Кудрявые фигурные скобки находятся не в том месте.

+0

Да .. скобки были в неправильном месте. Но все же я получаю логическую ошибку во время выполнения. Моя программа не печатает какой-либо вывод. – Teja

+0

Если вы запустите программу, используя отладчик IDE, вы увидите, какие потоки запущены. Появляются ли как потребительские, так и производственные потоки? Если один или оба потока ждут и никогда не проснутся, вы также сможете это увидеть. –

Смежные вопросы