Читаем Философия Java3 полностью

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.

Семафоры

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

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

// concurrency/Pool java

// Использование Semaphore в Pool ограничивает количество // задач, которые могут использовать ресурс import java util concurrent *. import java util *,

public class Pool { private int size,

private List items = new ArrayList(); private volatile boolean[] checkedOut, private Semaphore available, public Pool(Class classObject, int size) { this.size = size, checkedOut = new boolean[size], available = new Semaphore(size, true); // Заполнение пула объектами for(int i =0, i < size, ++i) try {

// Предполагается наличие конструктора по умолчанию items add(classObject newInstanceO). } catch(Exception e) {

throw new RuntimeException(e);

}

}

public T checkout О throws InterruptedException { available acquireO; return getltemO,

}

public void checkIn(T x) { if(releaseltem(x))

available releasee);

}

private synchronized T getltemO {

for(int i =0; i < size, ++i) if(!checkedOut[i]) {

checkedOut[i] = true, return items get(i);

}

return null. // Семафор предотвращает переход в зту точку

}

private synchronized boolean releaseItem(T item) { int index = items indexOf(item). if(index == -1) return false; // Отсутствует в списке if(checkedOut[index]) {

checkedOut[index] = false, return true,

}

return false; // He был освобожден

}

В этой упрощенной форме конструктор использует newlnstance() для заполнения пула объектами. Если вам понадобится новый объект, вызовите check-Out(); завершив работу с объектом, передайте его checkln().

Логический массив checkedOut отслеживает выданные объекты. Для управления его содержимым используются методы getltem() и releaseltem(). В свою очередь, эти методы защищены семафором available, поэтому в checkOut() семафор available блокирует дальнейшее выполнение при отсутствии семафорных разрешений (то есть при отсутствии объектов в пуле). Метод checkln() проверяет действительность возвращаемого объекта, и, если объект действителен, разрешение возвращается семафору.

Для примера мы воспользуемся классом Fat. Создание объектов этого класса является высокозатратной операцией, а на выполнение конструктора уходит много времени:

//: concurrency/Fat java

// Объекты, создание которых занимает много времени

public class Fat {

private volatile double d. // Предотвращает оптимизацию private static int counter = 0. private final int id = counter++. public FatО {

// Затратная, прервываемая операция for(int i = 1: i < 10000; i++) {

d += (Math PI + Math.E) / (double)i.

}

}

Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных