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

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

Жанры

Философия 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.

Семафоры

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

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

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

Вперед в прошлое 8

Ратманов Денис
8. Вперед в прошлое
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Вперед в прошлое 8

Газлайтер. Том 10

Володин Григорий
10. История Телепата
Фантастика:
боевая фантастика
5.00
рейтинг книги
Газлайтер. Том 10

Леди Малиновой пустоши

Шах Ольга
Любовные романы:
любовно-фантастические романы
6.20
рейтинг книги
Леди Малиновой пустоши

Чужая семья генерала драконов

Лунёва Мария
6. Генералы драконов
Фантастика:
фэнтези
5.00
рейтинг книги
Чужая семья генерала драконов

Чехов

Гоблин (MeXXanik)
1. Адвокат Чехов
Фантастика:
фэнтези
боевая фантастика
альтернативная история
5.00
рейтинг книги
Чехов

Кодекс Императора III

Сапфир Олег
3. Кодекс Императора
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Кодекс Императора III

Сирота

Ланцов Михаил Алексеевич
1. Помещик
Фантастика:
альтернативная история
5.71
рейтинг книги
Сирота

Мечник Вернувшийся 1000 лет спустя. Том 2

Ткачев Андрей Юрьевич
2. Вернувшийся мечник
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Мечник Вернувшийся 1000 лет спустя. Том 2

#Бояръ-Аниме. Газлайтер. Том 37

Володин Григорий Григорьевич
37. История Телепата
Фантастика:
фэнтези
аниме
боевая фантастика
5.00
рейтинг книги
#Бояръ-Аниме. Газлайтер. Том 37

Черный рынок

Вайс Александр
6. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
космоопера
5.00
рейтинг книги
Черный рынок

Наследник в Зеркальной Маске

Тарс Элиан
8. Десять Принцев Российской Империи
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Наследник в Зеркальной Маске

Наемник

Поселягин Владимир Геннадьевич
1. Вселенная EVE Online
Фантастика:
боевая фантастика
8.50
рейтинг книги
Наемник

Морской волк. 1-я Трилогия

Савин Владислав
1. Морской волк
Фантастика:
альтернативная история
8.71
рейтинг книги
Морской волк. 1-я Трилогия

Наследие Маозари 3

Панежин Евгений
3. Наследие Маозари
Фантастика:
рпг
аниме
5.00
рейтинг книги
Наследие Маозари 3