}
}
class Bell implements Runnable {
public void run() { System.out.println("Вам!"), }
}
class Terminate implements Runnable { public void run() {
System out ргШ1п("Завершение"); scheduler shutdownNowO;
// Для выполнения этой операции необходимо запустить // отдельную задачу, так как планировщик был отключен-new ThreadО {
public void runО {
for(DataPoint d • data)
System.out.println(d);
}
}. startO;
}
}
// Новая возможность: коллекция данных static class DataPoint {
final Calendar time; final float temperature; final float humidity;
public DataPoint(Calendar d, float temp, float hum) { time = d;
temperature = temp; humidity = hum;
}
public String toStringO {
return time getTimeO + String.formate
" температура: %l$.lf влажность: *2$.2f". temperature, humidity);
}
}
private Calendar lastTime = Calendar.getlnstanceO; { // Регулировка даты до получаса
1astTime.set(Calendar.MINUTE, 30); lastTime set(Calendar.SECOND. 00);
}
private float lastTemp = 65.Of.
private int tempDirecti on = +1;
private float lastHumidity = 50 Of;
private int humidityDirecti on = +1;
private Random rand = new Random(47);
List
new ArrayList
System.out.println("Сбор данных"); synchronized(GreenhouseScheduler.this) {
1astTi me.set(Ca1enda r. MINUTE.
lastTime.get(Calendar.MINUTE) + 30); // С вероятностью 1/5 происходит смена направления: if(rand.nextlnt(5) == 4)
tempDirecti on = -tempDirecti on; // Сохранить предыдущее значение: lastTemp = lastTemp +
tempDi recti on * (1 Of + rand.nextFloatO); if(rand.nextlnt(5) == 4)
humidityDirecti on = -humidityDirecti on; lastHumidity = lastHumidity +
humidityDi recti on * rand.nextFloatO; // Объект Calendar необходимо клонировать, иначе // все DataPoint будут содержать ссылки // на одно и то же lastTime. // Для базового объекта - такого, как Calendar -// вызова cloneO вполне достаточно, data.add(new DataPoint((Calendar)1astTime.cloneO. lastTemp. lastHumidity));
}
}
}
public static void main(String[] args) {
GreenhouseScheduler gh = new GreenhouseSchedulerO;
gh.schedule(gh.new TerminateO. 5000);
// Former "Restart" class not necessary:
gh.repeat(gh.new BellO. 0. 1000);
gh.repeat(gh.new ThermostatNightО. 0. 2000);
gh. repeat (gh. new LightOnO, 0. 200);
gh. repeat (gh. new LightOffO. 0. 400);
gh.repeat(gh.new WaterOn0. 0, 600);
gh. repeat (gh. new WaterOffO. 0. 800);
gh.repeat(gh.new ThermostatDayO. 0. 1400);
gh.repeat(gh.new CollectDataO. 500. 500).
}
} ///:-
В этой версии, помимо реорганизации кода, добавляется новая возможность: сбор данных о температуре и влажности в оранжерее. Объект DataPoint содержит и выводит одну точку данных, а запланированная задача CollectData генерирует данные имитации и включает их в List
Обратите внимание на ключевые слова volatile и synchronized; благодаря им задачи не мешают работе друг друга. Все методы контейнера List с элементами DataPoint синхронизируются с использованием метода synchronizedList() библиотеки java. u til. Со lie cti о n s при создании List.