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