Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
53
Добавлен:
08.06.2015
Размер:
37.38 Кб
Скачать

Практическая работа №6

Задание на практическую работу

В процессе написания тестовых заданий ознакомиться с общими принципами создания многопоточных приложений.

Задание 1

В пакете buildings.threads создайте два класса нитей (наследуют от класса Thread) Repairer и Cleaner, взаимодействующих с помощью промежуточного объекта типа Floor.

Первая нить последовательно считывает значения площадей помещений этажа. Каждый раз, когда она читает значение площади помещения, она выводит в консоль сообщение вида «Repairing space number <index> with total area <area> square meters». По достижении конца этажа, а также в случае прерывания нить заканчивает свое выполнение.

Вторая нить последовательно считывает значения площадей помещений этажа. Каждый раз, когда она читает значение помещения, она выводит в консоль сообщение вида «Cleaning room number <index> with total area <area> square meters». По достижении конца этажа, а также в случае прерывания нить заканчивает свое выполнение.

В методе main() следует создать 3 участвующих в процессе объекта и запустить нити на выполнение. Запустите программу несколько раз. Попробуйте варьировать приоритеты нитей. Проверьте поведение нитей в случае их прерывания вызовом метода interrupt().

Задание 2

В пакете buildings.threads создайте два новых класса SequentalRepairer и SequentalCleaner, реализующих интерфейс Runnable, с инструкциями для нитей.

Нити должны обеспечивать поочередность операций ремонта-уборки помещений (т.е. в консоль сообщения выводятся в порядке Repairing-Cleaning-Repairing-Cleaning-…) независимо от приоритетов потоков. Уборка помещения не может следовать до ремонта помещения.

Для этого потребуется описать вспомогательный класс семафора (http://ru.wikipedia.org/wiki/%D0%A1%D0%B5%D0%BC%D0%B0%D1%84%D0%BE%D1%80_(%D0%B8%D0%BD%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0)), объект которого будет использоваться при взаимодействии нитей.

В остальном новые реализации нити должны повторять функциональность нитей из задания 1.

Задание 3

Добавьте в класс Buildings со статическими методами обработки реализацию метода Floor synchronizedFloor (Floor floor), возвращающего ссылку на оболочку указанного объекта этажа, безопасную с точки зрения многопоточности.

Для этого потребуется в пакете buildings описать новый класс декоратора SynchronizedFloor, реализующий с обеспечением синхронизации методы интерфейса Floor, а также перегружающий ряд методов класса Object. Создание специальных итераторов и их синхронизация не требуются.

Задание 4

Создайте интерфейс BuildingFactory, содержащий методы:

  • public Space createSpace(double area)

  • public Space createSpace(int roomsCount, double area)

  • public Floor createFloor(int spacesCount)

  • public Floor createFloor(Space[] spaces)

  • public Building createBuilding(int floorsCount, int[] spacesCounts)

  • public Building createBuilding(Floor[] floors)

Задание 5

Создайте классы конкретных фабрик DwellingFactory, OfficeFactory, HotelFactory, реализующие интерфейс BuildingFactory и создающие объекты соответствующих типов.

Задание 6

В классе Buildings создайте статическое поле типа BuildingFactory и метод setBuildingFactory, позволяющие, соответственно, хранить ссылку и устанавливать ссылку на текущую конкретную фабрику.

По умолчанию поле должно ссылаться на объект, порождающий экземпляры класса Dwelling.

Задание 7

В классе Buildings реализуйте статические методы, которые с помощью текущей фабрики создают новые экземпляры соответствующих объектов. В остальных методах класса Buildings замените прямое создание экземпляров объектов на вызов методов фабрики.