diff --git a/lab3/src/main/java/ru/spbstu/telematics/java/Heater.java b/lab3/src/main/java/ru/spbstu/telematics/java/Heater.java index 81c1e40..9f0699e 100644 --- a/lab3/src/main/java/ru/spbstu/telematics/java/Heater.java +++ b/lab3/src/main/java/ru/spbstu/telematics/java/Heater.java @@ -1,15 +1,48 @@ package ru.spbstu.telematics.java; +import java.util.Random; + /* * Симулирует нагреватель, установленный в комнате. Может изменять поля комнаты, * а именно - увеличивать температуру в ней. */ public class Heater implements Runnable { - Room room; - private boolean isOn; - - @Override - public void run() { + private Room room; + public Heater(Room room) { + this.room = room; } + + private volatile boolean isOn; + + public void turnOn() { + this.isOn = true; + } + + public void turnOff() { + this.isOn = false; + } + + private Random random = new Random(); + private double temperatureMaxStep = 1; + private long maxStepTimeMs = 3000; + + + @Override + public void run() { + while (!Thread.interrupted()) { + if (isOn) room.adjustTemperature(random.nextDouble() * temperatureMaxStep); + + 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; + } } diff --git a/lab3/src/main/java/ru/spbstu/telematics/java/Room.java b/lab3/src/main/java/ru/spbstu/telematics/java/Room.java index 6b44c80..b52a8aa 100644 --- a/lab3/src/main/java/ru/spbstu/telematics/java/Room.java +++ b/lab3/src/main/java/ru/spbstu/telematics/java/Room.java @@ -13,6 +13,10 @@ public class Room implements Runnable { return temperature; } + public synchronized void adjustTemperature(double delta) { + this.temperature += delta; + } + // Относительная влажность в процентах private volatile double humidity = 0.5;