Читаем Философия 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) {

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

    }

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

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

    Access 2002: Самоучитель
    Access 2002: Самоучитель

    В книге рассматривается широкий круг вопросов, связанных с использованием программной среды Access 2002, которая является составной частью пакета Office 2002 и предназначена для создания банка данных в самых различных предметных областях.Подробно описывается методика проектирования объектов базы данных (таблицы, формы, отчеты, страницы доступа к данным, запросы, модули).Детально обсуждаются вопросы создания интегрированной базы данных в единой среде Access 2002: формирование БД с нуля, конвертирование в программную среду баз данных, созданных в ином программном окружении – Clarion, FoxPro.Особое внимание уделяется формированию разнообразных запросов к интегрированной базе данных Access 2002 с использованием языков программирования SQL, VBA и макросов.Приводятся общие сведения о возможностях языка обмена данными между различными компьютерами и приложениями (XML). Описываются возможности использования гиперссылок, связывающих базу данных с другими программными продуктами. Объясняется, как можно работать с базой данных Access 2002 без установки ее на компьютер, используя технологию ODBC (Open Data Base Connectivity). В приложениях приводятся количественные параметры Access 2002 и связанная с этой СУБД терминология.Предлагаемая книга будет полезна специалистам, занимающимся практической разработкой банков данных и приложений на их основе, а также студентам вузов, изучающим информатику.

    Павел Юрьевич Дубнов

    Программирование, программы, базы данных / ОС и Сети / Книги по IT