Задача: "Голодные птенцы". Есть N птенцов и их мать. Птенцы едят из общей миски, в которой сначала находятся F порций пищи. Каждый птенец съедает порцию еды, спит некоторое время, затем снова ест. Когда кончается еда, птенец, питавшийся последним, зовет мать. Птица наполняет миску F порциями еды и снова ждет, пока миска опустеет. Эти действия повторяются без конца. Представьте птиц процессами и разработайте код, моделирующий их действия. Для синхронизации используйте механизм монитора.
Первоначально была построена сеть Петри, для моделирования использована программа VIPeNET (рис. 1).
Мама птенцов наполняет миску 20-ью порциями еды. При моделировании не показывается процесс наполнения миски, визуально идет некоторая задержка по времени, и 20 порций появляются в миске. Затем, мама спит, и еда из миски распределяется по очереди, между каждым из 5-ти птенцов, до тех пор, пока не закончится вся. Визуально, значение порций в миске уменьшается на единицу, соответственно, по очереди прибавляется число съеденных порций в счетчике каждого птенца. Когда миска становится полностью пустой, процессы птенцов блокируются, и мама наполняет миску следующими 20-ю порциями (есть счетчик количества наполненных мисок). И начинается очередной цикл распределения еды между птенцами. Соответственно этому алгоритму реализован код следующей программы, написанный на Java 2 SE. Интерфейс программы состоит из одного окна (рис. 2).
Процессы наполнения миски и поедания еды из миски птенцами визуально представлены прогресс-барами и сообщениями в текстовом поле. Исходный код программа представляет собой 9 файлов-классов, объединенных в пакете package chick:
1. MainFrame. Фрейм для запуска программы. Содержит метода main
2. EnterFrame. Класс формирует методом CreateGUI() панели, созданные в классах PanelComponent и ComponentBtn.
3. PanelComponent. В этом классе создаются все компоненты пользовательского интерфейса (за исключением кнопок) средствами пакета Swing и AWT: панели, прогресс-бары, метки, текстовое поле, рамки, определяются цвет и тип шрифтов, начальное значение текста.
4. ComponentBtn. В этом классе создаются компоненты кнопок СТАРТ, СТОП и ЗАКРЫТЬ.
5. BoxLayoutUtils. Класс содержит методы для удобной работы блочным расположением компонентов. Используется в классах EnterFrame и PanelComponent.
6. LongProcess. Класс для создания поток и запуска прогресс-баров. Расширяет класс Thread из пакета java.lang.Thread. Точка входа потоков - метод void run().
7. OkAction. Класс - обработчик событий для кнопки СТАРТ (возможно обработка события мышью и с клавиатуры.
8. CancelAction. Класс - обработчик событий для кнопки СТОП. Содержит стандартный пакетный метод actionPerformed для обработки события мышью и метод keyPressed для обработки событий
9. CloseAction. Класс - обработчик событий для кнопки СТОП.