Согласование работы нескольких подпроцессов
В листинге 17.7 в класс store внесено логическое поле ready, отмечающее процесс получения и выдачи информации. Когда новая порция информации получена от поставщика Producer, в поле ready заносится значение true, получатель consumer может забирать эту порцию информации. После выдачи информации переменная ready становится равной false.
Но этого мало. То, что получатель может забрать продукт, не означает, что он действительно заберет его. Поэтому в конце метода setinform() получатель уведомляется о поступлении продукта методом notify (). Пока поле ready не примет нужное значение, подпроцесс переводится в "зал ожидания" методом wait (). Результат работы программы с обновленным классом store показан на рис. 17.5.
Листинг 17.7. Согласование получения и выдачи информации.
class Store{ private int inform = -1; private boolean ready; synchronized public int getlnform(){ try{ if (! ready) wait(); ready = false; return inform; }catch(InterruptedException ie){ }finally! notify(); } return -1; } synchronized public void setlnform(int n)( if (ready) try{ wait (); }catch(InterruptedException ie){} inform = n; ready = true; notify(); } }
Поскольку уведомление поставщика в методе getinform() должно происходить уже после отправки информации оператором return inform, оно включено в блок finally{}.
Рис. 17.5. Согласованная работа подпроцессов
Обратите внимание: сообщение "Got: 0" отстает на один шаг от действительного получения информации.