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

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

Жанры

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

Семафоры

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

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

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

На границе империй. Том 10. Часть 6

INDIGO
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 10. Часть 6

Антимаг его величества. Том III

Петров Максим Николаевич
3. Модификант
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Антимаг его величества. Том III

Герой

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

Печать Пожирателя

Соломенный Илья
1. Пожиратель
Фантастика:
попаданцы
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Печать Пожирателя

На границе империй. Том 7. Часть 2

INDIGO
8. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
6.13
рейтинг книги
На границе империй. Том 7. Часть 2

Шайтан Иван 3

Тен Эдуард
3. Шайтан Иван
Фантастика:
попаданцы
альтернативная история
7.17
рейтинг книги
Шайтан Иван 3

Изгой Проклятого Клана. Том 2

Пламенев Владимир
2. Изгой
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Изгой Проклятого Клана. Том 2

Твое сердце будет разбито. Книга 1

Джейн Анна
Любовные романы:
современные любовные романы
5.50
рейтинг книги
Твое сердце будет разбито. Книга 1

Играть... в тебя

Зайцева Мария
3. Звериные повадки Симоновых
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Играть... в тебя

Князь

Шмаков Алексей Семенович
5. Светлая Тьма
Фантастика:
юмористическое фэнтези
городское фэнтези
аниме
сказочная фантастика
5.00
рейтинг книги
Князь

Приказано выжить!

Малыгин Владимир
1. Другая Русь
Фантастика:
боевая фантастика
попаданцы
альтернативная история
7.09
рейтинг книги
Приказано выжить!

Личный аптекарь императора

Карелин Сергей Витальевич
1. Личный аптекарь императора
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Личный аптекарь императора

Серпентарий

Мадир Ирена
Young Adult. Темный мир Шарана. Вселенная Ирены Мадир
Фантастика:
фэнтези
готический роман
5.00
рейтинг книги
Серпентарий

Цеховик. Книга 1. Отрицание

Ромов Дмитрий
1. Цеховик
Фантастика:
попаданцы
альтернативная история
5.75
рейтинг книги
Цеховик. Книга 1. Отрицание