Files
java_labs/lab3/report/report.txt
2025-02-12 12:43:38 +03:00

97 lines
9.3 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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 .*