Непонятно, в чем ошибка программы?

Здравствуйте! Я изучаю Java по последнему изданию книги Шилдта, и у меня возникла ошибка с одним из примеров. В консоль данный код выводит только "Для остановки нажмите Ctrl-C", а сама работа потоков не выводится. В чем может быть проблема?
public class Q {
    int n;
    boolean valueSet = false;


    synchronized int get(){
        while(!valueSet)
            try{
                wait();
            } catch(InterruptedException e){
                System.out.println("Исключение типа InterruptedException перехвачено");
            }
        System.out.println("Получено: " + n);
        valueSet = false;
        notify();
        return n;
    }

    synchronized void out(int n){
        while(valueSet)
            try{
                wait();
            } catch(InterruptedException e){
                System.out.println("Исключение типа InterruptedException перехвачено");
            }
        this.n = n;
        valueSet = true;
        System.out.println("отправлено: " + n);
        notify();
       }

    public void put(int i) {
        i++;
    }
}
  class Producer implements Runnable{
      Q q;

      Producer(Q q){
          this.q = q;
          new Thread(this, "Поставщик").start();
      }

      @Override
      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, "Потребитель").start();
      }

      @Override
      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("Для остановки нажмите Ctrl-C");
    }
}
  • Вопрос задан
  • 264 просмотра
Решения вопроса 2
@gausdrem
ты учишь по 8 изданию
тогда там такой код
// правильная реализация поставшика ипотребителя.
class Q {
int n;
boolean valueSet = false;
synchronized int get () {
while ( ! valueSet )
try {
wait ();
} catch ( InterruptedException e ) {
System.out.println ( " InterruptedException perehvacheno ");
}
System.out.println ( " Polycheno " + n );
valueSet = false;
notify ();
return n;
}
synchronized void put ( int n) {
while ( valueSet)
try {
wait ();
} catch ( InterruptedException e ) {
System.out.println ( " InterruptedException perehvacheno ");
}
this.n = n;
valueSet = true;
System.out.println ( " Otpravleno: " + n);
notify();
}
}
class Producer implements Runnable {
Q q;
Producer ( Q q) {
this.q = q;
new Thread ( this, " Postavshik " ).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, " Potrebitel " ).start ();
}
public void run () {
while ( true ) {
q.get ();
}
}
}
class PC {
public static void main ( String args []) {
Q q = new Q ();
new Producer (q);
new Consumer ( q );
System.out.println ( " Dli ostanvci nagmite Control-C. ");
}
}
кроме сообщений это мои надписи
Ответ написан
@onepavel
Консультация и разработка мобильных приложений
Попробуй у дочерних потоков вызвать join()
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы