Compare commits
6 Commits
f12bac21b1
...
5b753c1dda
| Author | SHA1 | Date | |
|---|---|---|---|
| 5b753c1dda | |||
| 289935499b | |||
| db840afffa | |||
| 0f3e71f775 | |||
| 23de6a3d93 | |||
| 5c1a148ffa |
5
lab3/README.md
Normal file
5
lab3/README.md
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
## Задание
|
||||||
|
В данной работе необходимо написать многопоточное приложение, которое эмулирует заданную модель. Студент сам должен спроектировать потоки, которые отвечают за поведение сущностей из полученного задания. Взаимодействие потоков должно быть синхронизировано и приложение должно быть протестирование на наличие dead locks и race conditions. Приложение не должно переставать работать из-за изменения задержек и модель не должна быть полностью синхронной.
|
||||||
|
|
||||||
|
### Мой вариант
|
||||||
|
Обогреватель — вентилятор. Каждая комната в здании имеет управляющий терминал для наблюдения и контролирования за окружающей средой. Каждый терминал измеряет и выводит текущую температуру и влажность. В каждой комнаты кроме того установлена предпочтительная температура и влажность (пара чисел). Если текущие значения температуры или влажности вышли за пределы предпочтительных настроек более чем на 1%, тогда станция включает/выключает обогреватель или вентилятор. Должны быть следующие процессы: сенсоры, настройки, обогреватель — вентилятор, контроллер.
|
||||||
39
lab3/pom.xml
Normal file
39
lab3/pom.xml
Normal 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>
|
||||||
13
lab3/src/main/java/ru/spbstu/telematics/java/App.java
Normal file
13
lab3/src/main/java/ru/spbstu/telematics/java/App.java
Normal 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!" );
|
||||||
|
}
|
||||||
|
}
|
||||||
20
lab3/src/main/java/ru/spbstu/telematics/java/Controller.java
Normal file
20
lab3/src/main/java/ru/spbstu/telematics/java/Controller.java
Normal 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() {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
15
lab3/src/main/java/ru/spbstu/telematics/java/Fan.java
Normal file
15
lab3/src/main/java/ru/spbstu/telematics/java/Fan.java
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
package ru.spbstu.telematics.java;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Симулирует вентилятор, установленный в комнате. Может изменять поля комнаты,
|
||||||
|
* а именно - уменьшать влажность в ней.
|
||||||
|
*/
|
||||||
|
public class Fan implements Runnable {
|
||||||
|
Room room;
|
||||||
|
private boolean isOn;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
15
lab3/src/main/java/ru/spbstu/telematics/java/Heater.java
Normal file
15
lab3/src/main/java/ru/spbstu/telematics/java/Heater.java
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
package ru.spbstu.telematics.java;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Симулирует нагреватель, установленный в комнате. Может изменять поля комнаты,
|
||||||
|
* а именно - увеличивать температуру в ней.
|
||||||
|
*/
|
||||||
|
public class Heater implements Runnable {
|
||||||
|
Room room;
|
||||||
|
private boolean isOn;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
48
lab3/src/main/java/ru/spbstu/telematics/java/Room.java
Normal file
48
lab3/src/main/java/ru/spbstu/telematics/java/Room.java
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
15
lab3/src/main/java/ru/spbstu/telematics/java/Sensor.java
Normal file
15
lab3/src/main/java/ru/spbstu/telematics/java/Sensor.java
Normal 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() {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
14
lab3/src/main/java/ru/spbstu/telematics/java/Settings.java
Normal file
14
lab3/src/main/java/ru/spbstu/telematics/java/Settings.java
Normal 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() {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
11
lab3/src/test/java/ru/spbstu/telematics/java/AppTest.java
Normal file
11
lab3/src/test/java/ru/spbstu/telematics/java/AppTest.java
Normal 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
27
lab3/src/test/java/ru/spbstu/telematics/java/RoomTests.java
Normal file
27
lab3/src/test/java/ru/spbstu/telematics/java/RoomTests.java
Normal 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();
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user