Compare commits

...

6 Commits

11 changed files with 222 additions and 0 deletions

5
lab3/README.md Normal file
View File

@@ -0,0 +1,5 @@
## Задание
В данной работе необходимо написать многопоточное приложение, которое эмулирует заданную модель. Студент сам должен спроектировать потоки, которые отвечают за поведение сущностей из полученного задания. Взаимодействие потоков должно быть синхронизировано и приложение должно быть протестирование на наличие dead locks и race conditions. Приложение не должно переставать работать из-за изменения задержек и модель не должна быть полностью синхронной.
### Мой вариант
Обогреватель — вентилятор. Каждая комната в здании имеет управляющий терминал для наблюдения и контролирования за окружающей средой. Каждый терминал измеряет и выводит текущую температуру и влажность. В каждой комнаты кроме того установлена предпочтительная температура и влажность (пара чисел). Если текущие значения температуры или влажности вышли за пределы предпочтительных настроек более чем на 1%, тогда станция включает/выключает обогреватель или вентилятор. Должны быть следующие процессы: сенсоры, настройки, обогреватель — вентилятор, контроллер.

39
lab3/pom.xml Normal file
View File

@@ -0,0 +1,39 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>ru.spbstu.telematics.java</groupId>
<artifactId>lab3</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>lab3</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.9.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.9.1</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.2.0</version>
<configuration>
<archive>
<manifest>
<mainClass>ru.spbstu.telematics.java.App</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
</project>

View File

@@ -0,0 +1,13 @@
package ru.spbstu.telematics.java;
/**
* Hello world!
*
*/
public class App
{
public static void main( String[] args )
{
System.out.println( "Hello World!" );
}
}

View File

@@ -0,0 +1,20 @@
package ru.spbstu.telematics.java;
/*
* Симулирует работу контроллера, установленного в комнате. Контроллер может снимать
* показания с сенсоров и управлять работой нагревателя и вентилятора, в соответствии
* с указанными настройками. При этом сам контроллер не читает и не изменяет поля
* комнаты напрямую.
*/
public class Controller implements Runnable {
private Room room;
private Settings settings;
private Sensor sensor;
private Heater heater;
private Fan fan;
@Override
public void run() {
}
}

View File

@@ -0,0 +1,15 @@
package ru.spbstu.telematics.java;
/*
* Симулирует вентилятор, установленный в комнате. Может изменять поля комнаты,
* а именно - уменьшать влажность в ней.
*/
public class Fan implements Runnable {
Room room;
private boolean isOn;
@Override
public void run() {
}
}

View File

@@ -0,0 +1,15 @@
package ru.spbstu.telematics.java;
/*
* Симулирует нагреватель, установленный в комнате. Может изменять поля комнаты,
* а именно - увеличивать температуру в ней.
*/
public class Heater implements Runnable {
Room room;
private boolean isOn;
@Override
public void run() {
}
}

View File

@@ -0,0 +1,48 @@
package ru.spbstu.telematics.java;
import java.util.Random;
/*
* Симулирует физические процессы, протекающие в команте.
*/
public class Room implements Runnable {
// Температура измеряется в градусах цельсия
private volatile double temperature = 24.0;
public double getTemperature() {
return temperature;
}
// Относительная влажность в процентах
private volatile double humidity = 0.5;
public double getHumidity() {
return humidity;
}
// Параметры произвольного изменения температуры и влажности в комнате
private Random random = new Random();
private double temperatureMaxStep = 1;
private double humidityMaxStep = 0.05;
private long maxStepTimeMs = 3000;
@Override
public void run() {
// Пусть температура и влажность произвольно изменяются со временем
while (!Thread.interrupted()) {
temperature += (random.nextDouble() - 0.5) * 2 * temperatureMaxStep;
humidity += (random.nextDouble() - 0.5) * 2 * humidityMaxStep;
try {
Thread.sleep(getStepTime());
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}
private long getStepTime() {
// Спим от 0.5 * maxStepTimeMs до maxSteTimeMs миллисекунд
return (long) (random.nextDouble() * 0.5 + 0.5) * maxStepTimeMs;
}
}

View File

@@ -0,0 +1,15 @@
package ru.spbstu.telematics.java;
/*
* Симулирует работу сенсоров, установленных в комнате.
*/
public class Sensor implements Runnable {
Room room;
private double temperature;
private double humidity;
@Override
public void run() {
}
}

View File

@@ -0,0 +1,14 @@
package ru.spbstu.telematics.java;
/*
* Симулирует переодическое изменение настроек пользователем.
*/
public class Settings implements Runnable {
private double temperature;
private double humidity;
@Override
public void run() {
}
}

View File

@@ -0,0 +1,11 @@
package ru.spbstu.telematics.java;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
class SampleTests {
@Test
void sampleTest() {
assertTrue(true);
}
}

View File

@@ -0,0 +1,27 @@
package ru.spbstu.telematics.java;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
public class RoomTests {
/*
* Проверяет, что температура и влажность изменяются со временем.
*/
@Test
public void testTemperatureAndHumidityChange() throws InterruptedException {
Room room = new Room();
double initialTemperature = room.getTemperature();
double initialHumidity = room.getHumidity();
Thread thread = new Thread(room);
thread.start();
Thread.sleep(5000);
assertNotEquals(initialTemperature, room.getTemperature());
assertNotEquals(initialHumidity, room.getHumidity());
thread.interrupt();
thread.join();
}
}