diff --git a/lab3/report/report.txt b/lab3/report/report.txt new file mode 100644 index 0000000..e22a649 --- /dev/null +++ b/lab3/report/report.txt @@ -0,0 +1,97 @@ +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 секунд симуляции представлены на скриншоте ниже. + +
+mvn package
+java -jar .\target\lab3-1.0-SNAPSHOT.jar
+
+ +!results.png! + + +h2. Исходный код + +*Исходный код доступен на "GitHub":https://github.com/Arity-T/java_labs/tree/main/lab3 .* \ No newline at end of file