Java как центр архипелага | страница 16



  my_producer (my_buffer buf, int count)

    { super() ;

      the_buffer = buf ;

      items_to_do = count ;

    }

  public void run ()

    {

      while (items_to_do > 0)

        { System.out.println ("producer to_do = " + items_to_do) ;

          Integer item = new Integer (items_to_do*items_to_do) ;

          the_buffer.insert (item) ;

          items_to_do-- ;

        }

      System.out.println ("Производитель заканчивает работу") ;

    }

}

class my_consumer extends Thread

{

  int items_to_do ;

  my_buffer the_buffer ;

  my_consumer (my_buffer buf, int count)

    { super() ;

      the_buffer = buf ;

      items_to_do = count ;

    }

  public void run ()

    {

      while (items_to_do > 0)

        { System.out.println ("consumer to_do = " + items_to_do) ;

          Object item = the_buffer.extract () ;

          System.out.println ("consumer got " + item) ;

          items_to_do-- ;

        }

      System.out.println ("Потребитель заканчивает работу") ;

      synchronized (this){

        notify () ; // Посылаем уведомление о завершении работы

                    // (см. con.wait() в main())

      }

    }

}

public class threaded3

{

  public static void main (String [] args) throws InterruptedException

    {

      my_buffer the_buffer = new my_buffer () ;

      my_producer prod = new my_producer (the_buffer, 40) ;

      my_consumer con  = new my_consumer (the_buffer, 40) ;

      Thread.currentThread().setPriority (5) ;

      prod.setPriority (4) ;  // Производитель получает более высокий приоритет

      con.setPriority  (3) ;  // по сравнению с потребителем

      prod.start() ;

      con.start() ;

      synchronized (con)

        {

          con.wait() ;  // Ждем уведомления от производителя об окончании

                        // его работы

        }

      System.out.println ("Производитель и потребитель закончили работу") ;

    }

}

Приведенная программа написана в очень хорошем, понятном стиле.

Мы  прокомментируем  лишь  один  момент.  В  методах insert() и

extract() класса my_buffer вызов wait() содержится внутри  бес-

конечного цикла. Дело в том, что вызов notify() относится к об-

®екту  в  целом.  "Разбуженный"  об®ект должен проанализировать

свое состояние и решить, что делать дальше. Так, если  "заснул"

метод insert(), то после возобновления работы необходимо прове-

рить, что буфер уже не полон и добавление нового элемента стало

возможным. Если это не так, метод insert() заснет вновь.

        * 4.2. Технология Java