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

public void operationO { System out println(this); } public String toStringO { return "Fat id: " + id; } } ///:-

Мы создадим пул объектов Fat, чтобы свести к минимуму затраты на выполнение конструктора. Для тестирования класса Pool будет создана задача, которая забирает объекты Fat для использования, удерживает их в течение некоторого времени, а затем возвращает обратно:

// concurrency/SemaphoreDemo java // Тестирование класса Pool import java.util.concurrent.*; import java util *;

import static net.mindview.util.Print.*;

// Задача для получения ресурса из пула: class CheckoutTask implements Runnable { private static int counter = 0; private final int id = counter++; private Pool pool. public CheckoutTask(Pool pool) { this.pool = pool;

}

public void run() { try {

T item = pool.checkoutО;

print(this + "checked out " + item); продолжение &

TimeUnit SECONDS sleep(l), pri nt(thi s +"checking in " + item), pool checkln(item). } catch(InterruptedException e) {

// Приемлемый способ завершения

}

}

public String toStringO {

return "CheckoutTask " + id + " ";

public class SemaphoreDemo {

final static int SIZE = 25;

public static void main(String[] args) throws Exception { final Pool pool =

new Pool(Fat.class. SIZE). ExecutorService exec = Executors newCachedThreadPoolО. for(int i = 0; i < SIZE; i++)

exec.execute(new CheckoutTask(pool)). print("All CheckoutTasks created"); List list = new ArrayList0. for(int i = 0; i < SIZE; i++) { Fat f = pool.checkout О. printnb(i + " mainO thread checked out "). f operationO; list add(f);

}

Future blocked = exec submit(new RunnableO { public void runO { try {

// Семафор предотвращает лишний вызов checkout. // поэтому следующий вызов блокируется: pool checkOutO. } catch(InterruptedException e) {

pri nt("checkout() Interrupted");

}

}

}):

TimeUnit.SECONDS sleep(2);

blocked.cancel(true); // Выход из заблокированного вызова print("Checking in objects in " + list); for(Fat f • list)

pool checkln(f); for(Fat f : list)

pool.checkln(f); // Второй вызов checkln игнорируется exec.shutdown О;

}

} ///:-

В коде main() создается объект Pool для хранения объектов Fat, после чего группа задач CheckoutTask начинает использовать Pool. Далее поток main() начинает выдавать объекты Fat, не возвращая их обратно. После того как все объекты пула будут выданы, семафор запрещает дальнейшие выдачи. Метод run() блокируется, и через две секунды вызывается метод cancel(). Лишние возвраты Pool игнорирует.

Exchanger

Класс Exchanger представляет собой «барьер», который меняет местами объекты двух задач. На подходе к барьеру задачи имеют один объект, а на выходе — объект, ранее удерживавшийся другой задачей. Объекты Exchanger обычно используются в тех ситуациях, когда одна задача создает высокозатратные объекты, а другая задача эти объекты потребляет.

Чтобы опробовать на практике класс Exchanger, мы создадим задачу-постав-щика и задачу-потребителя, которые благодаря параметризации и генераторам могут работать с объектами любого типа. Затем эти параметризованные задачи будут применены к классу Fat. ExchangerProducer и ExchangerConsumer меняют местами List; при вызове метода Exchanger.exchange() вызов блокируется до тех пор, пока парная задача не вызовет свой метод exchange(), после чего оба метода exchange() завершаются, а контейнеры List меняются местами:

//: concurrency/ExchangerDemo.java import java.util.concurrent.*; import java.util.*; i mport net.mi ndvi ew.uti1.*:

class ExchangerProducer implements Runnable { private Generator generator; private Exchanger> exchanger; private List holder; ExchangerProducer(Exchanger

  • > exchg, Generator gen, List holder) { exchanger = exchg; generator = gen; this.holder = holder;
  • }

    public void run() { try {

    while(IThread.interruptedO) {

    for(int i =0; i < ExchangerDemo size; i++)

    hoi der.add(generator. nextO); // Заполненный контейнер заменяется пустым: holder = exchanger exchange(holder);

    }

    } catchdnterruptedException e) {

    // Приемлемый способ завершения.

    }

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

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

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

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

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

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

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

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

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