Чтение онлайн

на главную - закладки

Жанры

Философия Java3

Эккель Брюс

Шрифт:

}

ScheduledThreadPoolExecutor scheduler =

new ScheduledThreadPoolExecutor(10), public void schedule(Runnable event, long delay) {

scheduler schedule(event,delay.TimeUnit MILLISECONDS);

}

public void

repeat(Runnable event, long i niti alDel ay, long period) { scheduler scheduleAtFixedRate(

event, i niti alDel ay. period, TimeUnit MILLISECONDS);

}

class LightOn implements Runnable { public void run {

// Сюда помещается аппаратный вызов, выполняющий // физическое включение

света System out.printin("Свет включен"); light = true;

}

}

class LightOff implements Runnable { public void run {

// Сюда помещается аппаратный вызов, выполняющий // физическое выключение света. System.out.printin("Свет выключен"), light = false,

}

}

class WaterOn implements Runnable { public void run {

// Здесь размещается код включения // системы полива.

System out printlnC"Полив включен"); water = true;

}

}

class WaterOff implements Runnable { public void run О {

// Здесь размещается код выключения // системы полива

System out.printin("Полив выключен"); water = false,

}

}

class ThermostatNight implements Runnable { public void run {

// Здесь размещается код управления оборудованием System.out.ргШ1п("Включение ночного режима"); setThermostat("Ho4b"), } продолжение &

}

class ThermostatDay implements Runnable { public void run {

// Здесь размещается код управления оборудованием System out рпп^пСВключение дневного режима"), setThermostatCfleHb"),

}

}

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<DataPoint> data = Collections.synchronizedList(

new ArrayList<DataPoint>0); class CollectData implements Runnable { public void run

О {

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<DataPoint> при каждом запуске.

Обратите внимание на ключевые слова volatile и synchronized; благодаря им задачи не мешают работе друг друга. Все методы контейнера List с элементами DataPoint синхронизируются с использованием метода synchronizedList библиотеки java. u til. Со lie cti о n s при создании List.

Семафоры

При обычной блокировке доступ к ресурсу в любой момент времени разрешается только одной задаче. Семафор со счетчиком позволяет п задачам одновременно* обращаться к ресурсу. Можно считать, что семафор «выдает разрешения» на использование ресурса, хотя никаких реальных объектов разрешений в этой схеме нет.

В качестве примера рассмотрим концепцию пула объектов: объекты, входящие в пул, «выдаются» для использования, а затем снова возвращаются в пул после того, как пользователь закончит работу с ними. Эта функциональность инкапсулируется в параметризованном классе:

Поделиться:
Популярные книги

Сотворение миров (сборник)

Ларионова Ольга Николаевна
Фантастика:
научная фантастика
5.00
рейтинг книги
Сотворение миров (сборник)

Свободный среди звезд: пилот

Викулов Петр Иванович
Вселенная EVE Online
Фантастика:
космическая фантастика
7.83
рейтинг книги
Свободный среди звезд: пилот

Воин

Бубела Олег Николаевич
2. Совсем не герой
Фантастика:
фэнтези
попаданцы
9.25
рейтинг книги
Воин

Пушкарь. Пенталогия

Корчевский Юрий Григорьевич
Фантастика:
альтернативная история
8.11
рейтинг книги
Пушкарь. Пенталогия

В тебе моя жизнь...

Струк Марина
Любовные романы:
исторические любовные романы
9.21
рейтинг книги
В тебе моя жизнь...

Свобода – точка отсчета. О жизни, искусстве и о себе

Вайль Петр
Документальная литература:
публицистика
6.25
рейтинг книги
Свобода – точка отсчета. О жизни, искусстве и о себе

Бессонница (др.перевод)

Кинг Стивен
17. Темная Башня
Фантастика:
ужасы и мистика
8.33
рейтинг книги
Бессонница (др.перевод)

Поход

Валериев Игорь
4. Ермак
Фантастика:
боевая фантастика
альтернативная история
6.25
рейтинг книги
Поход

1941: Время кровавых псов

Золотько Александр Карлович
1. Всеволод Залесский
Приключения:
исторические приключения
6.36
рейтинг книги
1941: Время кровавых псов

Эволюционер из трущоб

Панарин Антон
1. Эволюционер из трущоб
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Эволюционер из трущоб

Сетевые средства Linux

Смит Родерик В.
Компьютеры и Интернет:
ос и сети
5.00
рейтинг книги
Сетевые средства Linux

Отряд

Посняков Андрей
Отряд тайных дел
Фантастика:
фэнтези
боевая фантастика
6.25
рейтинг книги
Отряд

Тетралогия Будущего

Хайнлайн Роберт Энсон
Шедевры фантастики
Фантастика:
боевая фантастика
юмористическая фантастика
7.73
рейтинг книги
Тетралогия Будущего

50 Оттенков: До встречи с тобой

Kessie99
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
50 Оттенков: До встречи с тобой