97 lines
9.3 KiB
Plaintext
97 lines
9.3 KiB
Plaintext
h1. Отчёт по лабораторной работе №3 (Тищенко Артём)
|
||
|
||
|
||
h2. Задание
|
||
|
||
В данной работе необходимо написать многопоточное приложение, которое эмулирует заданную модель. Студент сам должен спроектировать потоки, которые отвечают за поведение сущностей из полученного задания. Взаимодействие потоков должно быть синхронизировано и приложение должно быть протестирование на наличие dead locks и race conditions. Приложение не должно переставать работать из-за изменения задержек и модель не должна быть полностью синхронной.
|
||
|
||
h2. Мой вариант
|
||
|
||
Обогреватель — вентилятор. Каждая комната в здании имеет управляющий терминал для наблюдения и контролирования за окружающей средой. Каждый терминал измеряет и выводит текущую температуру и влажность. В каждой комнаты кроме того установлена предпочтительная температура и влажность (пара чисел). Если текущие значения температуры или влажности вышли за пределы предпочтительных настроек более чем на 1%, тогда станция включает/выключает обогреватель или вентилятор. Должны быть следующие процессы: сенсоры, настройки, обогреватель — вентилятор, контроллер.
|
||
|
||
h2. Архитектура и компоненты реализации
|
||
|
||
Приложение состоит из нескольких основных классов:
|
||
|
||
# *App*
|
||
#* Точка входа в программу.
|
||
#* Создаёт объект _Room_, объекты _Settings_ и _Controller_, затем запускает поток с контроллером.
|
||
#* При необходимости может выступать стартовой площадкой для других потоков (например, если вы решите запускать класс _Room_ как отдельный поток).
|
||
# *Room* (реализует _Runnable_)
|
||
#* Симулирует физические процессы в комнате.
|
||
#* Хранит внутренние поля:
|
||
#** _temperature_ – текущая температура в градусах Цельсия.
|
||
#** _humidity_ – текущая относительная влажность (0..1).
|
||
#* Периодически изменяет температуру и влажность случайным образом.
|
||
#* Методы _adjustTemperature()_ и _adjustHumidity()_ помечены как _synchronized_, чтобы избежать гонок данных.
|
||
#* При запуске в потоке (метод _run()_) постоянно вносит небольшие случайные изменения в температуру и влажность.
|
||
# *Sensor* (реализует _Runnable_)
|
||
#* Представляет набор датчиков в комнате.
|
||
#* Периодически (с заданным интервалом) считывает актуальную _temperature_ и _humidity_ из _Room_, добавляя некоторую случайную погрешность.
|
||
#* Хранит результат измерений во внутренних полях (например, _temperature_, _humidity_).
|
||
#* Эти значения затем читает _Controller_.
|
||
# *Heater* (реализует _Runnable_)
|
||
#* Нагреватель комнаты.
|
||
#* При включённом состоянии (_isOn_ = true) повышает температуру в комнате на случайную величину.
|
||
#* Работает в собственном потоке, периодически внося изменения в _Room_ (через _adjustTemperature()_).
|
||
# *Fan* (реализует _Runnable_)
|
||
#* Вентилятор, уменьшающий влажность.
|
||
#* При включённом состоянии (_isOn_ = true) понижает влажность в комнате на случайную величину.
|
||
#* Работает в собственном потоке, периодически внося изменения в _Room_ (через _adjustHumidity()_).
|
||
# *Controller* (реализует _Runnable_)
|
||
#* Логический контроллер, который:
|
||
#** Читает измерения с _Sensor_ (температура и влажность).
|
||
#** Сравнивает их с желаемыми параметрами из _Settings_.
|
||
#** Включает/выключает _Heater_ и _Fan_, если показатели выходят за пределы допустимых значений.
|
||
#* Запускается в отдельном потоке и периодически (по заданному интервалу) проверяет состояние сенсоров и управляет нагревателем/вентилятором.
|
||
#* При завершении (прерывании) аккуратно останавливает все подчинённые потоки (_Sensor_, _Heater_, _Fan_).
|
||
# *Settings* (реализует _Runnable_)
|
||
#* Хранит желаемую температуру и влажность, заданные пользователем.
|
||
#* Периодически (в методе _run()_) может изменять эти настройки, симулируя поведение человека, корректирующего параметры.
|
||
#* Хранится и используется в _Controller_ для решения, когда включать/выключать нагреватель и вентилятор.
|
||
# *Utils*
|
||
#* Вспомогательный класс с методами:
|
||
#** _sleep(...)_ – безопасная пауза (учитывает _InterruptedException_).
|
||
#** _sleepRandomTime(...)_ – пауза случайной длины (диапазон задаётся параметрами).
|
||
#* Используется всеми потоками для имитации задержек, дабы избежать полного синхронного шага у всех объектов.
|
||
|
||
|
||
h2. Тестирование
|
||
|
||
Ниже приведён краткий обзор тестовых классов и методов, покрывающих основные аспекты работы приложения:
|
||
|
||
# *AppTest*
|
||
#* *testNoDeadlock()* – проверяет отсутствие взаимной блокировки (deadlock), когда одновременно запущены _Controller_ и _Room_.
|
||
#* *testNoRaceCondition()* – тест на отсутствие гонок (race conditions), в ходе которого периодически проверяются значения температуры и влажности в _Room_.
|
||
# *FanTests*
|
||
#* *testFanOn()* – проверяет, что при включённом вентиляторе влажность в комнате уменьшается, а температура остаётся без изменений.
|
||
#* *testFanOff()* – проверяет, что при выключенном вентиляторе ни температура, ни влажность не меняются.
|
||
# *HeaterTests*
|
||
#* *testHeaterOn()* – убеждается, что при включённом нагревателе температура в комнате увеличивается, а влажность не меняется.
|
||
#* *testHeaterOff()* – при выключенном нагревателе показатели комнаты не меняются.
|
||
# *RoomTests*
|
||
#* *testTemperatureAndHumidityChange()* – запускает _Room_ в отдельном потоке и проверяет, что температура и влажность действительно меняются со временем.
|
||
# *SensorTests*
|
||
#* *testSensor()* – эмулирует работу сенсора с помощью макета комнаты (_MockRoom_), сверяет реальное значение температуры и влажности с тем, что возвращает сенсор, учитывая допустимую погрешность.
|
||
|
||
h3. Результаты тестов
|
||
|
||
Ниже представлена иллюстрация (вывод в консоли) после успешного запуска _mvn test_, где видно, что все тесты проходят:
|
||
|
||
!tests-results.png!
|
||
|
||
h2. Результаты работы программы
|
||
|
||
Результаты 60 секунд симуляции представлены на скриншоте ниже.
|
||
|
||
<pre>
|
||
mvn package
|
||
java -jar .\target\lab3-1.0-SNAPSHOT.jar
|
||
</pre>
|
||
|
||
!results.png!
|
||
|
||
|
||
h2. Исходный код
|
||
|
||
*Исходный код доступен на "GitHub":https://github.com/Arity-T/java_labs/tree/main/lab3 .* |