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

class ExchangerConsumer implements Runnable { private Exchanger> exchanger; private List holder; private volatile T value;

ExchangerConsumer(Exchanger> ex, List holder){ exchanger = ex; this.holder = holder;

}

public void runO {

} catch(InterruptedException e) {

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

}

System out.printlnC'HToroBoe значение- " + value).

}

}

public class ExchangerDemo { static int size = 10; static int delay = 5; // Секунды

public static void main(String[] args) throws Exception { if(args.length > 0)

size = new lnteger(args[0]), if(args.length > 1)

delay = new Integer(args[l]); ExecutorService exec = Executors.newCachedThreadPoolО. Exchanger> xc = new Exchanger

producerList = new CopyOnWriteArrayList(). consumerList = new CopyOnWriteArrayList(); exec.execute(new ExchangerProducer(xc.

BasicGenerator.create(Fat.class). producerList)); exec.execute(

new ExchangerConsumer(xc.consumerLi st)); TimeUni t.SECONDS.sieep(delay); exec shutdownNowO;

}

} /* Output:

Итоговое значение: Fat id: 29999 *///.-

В методе main() для обеих задач создается один объект Exchanger, а для перестановки создаются два контейнера CopyOnWriteArrayList. Эта разновидность List нормально переносит вызов метода remove() при перемещении по списку, не выдавая исключения ConcurrentModificationException. ExchangerProducer заполняет список, а затем меняет местами заполненный список с пустым, передаваемым от ExchangerConsumer. Благодаря Exchanger заполнение списка происходит одновременно с использованием уже заполненного списка.

Моделирование

Одна из самых интересных областей применения параллельных вычислений — всевозможные имитации и моделирование. Каждый компонент модели оформляется в виде отдельной задачи, что значительно упрощает его программирование.

whi 1е(!Thread interruptedO) {

holder = exchanger.exchange(holder), for(T x . holder) {

value = x; // Выборка значения holder remove(x); // Нормально для

CopyOnWri teArrayLi st

Примеры HorseRace.java и GreenhouseScheduler.java, приведенные ранее, тоже можно считать своего рода имитаторами.

Модель кассира

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

//. concurrency/BankTel1erSimulation.java

// Пример использования очередей и многопоточного программирования. // {Args. 5}

import java.util.concurrent *. import java.util *;

// Объекты, доступные только для чтения, не требуют синхронизации-class Customer {

private final int serviceTime, public Customer(int tm) { serviceTime = tm; } public int getServiceTimeO { return serviceTime; } public String toStringO {

return "[" + serviceTime + "]";

}

}

// Очередь клиентов умеет выводить информацию о своем состоянии: class CustomerLine extends ArrayBlockingQueue { public Customerl_ine(int maxLineSize) { super(maxLineSize),

}

public String toStringO {

ifCthis sizeO == 0)

return "[Пусто]"; StringBuilder result = new StringBuilderO; for(Customer customer this)

result append(customer), return result toStringO,

}

}

// Случайное добавление клиентов в очередь: class CustomerGenerator implements Runnable { private CustomerLine customers, private static Random rand = new Random(47), public CustomerGenerator(CustomerLine cq) { customers = cq,

}

public void runO { try {

while(IThread.interruptedO) {

TimeUnit MILLISECONDS.sleep(rand nextlnt(300)):

продолжение &

customers put(new Customer(rand nextlnt(lOOO)));

}

} catchdnterruptedException e) {

System.out.pri ntin("CustomerGenerator i nterrupted");

}

System.out printin("CustomerGenerator terminating");

class Teller implements Runnable. Comparable { private static int counter = 0; private final int id = counter**; // Счетчик клиентов, обслуженных за текущую смену: private int customersServed = 0; private CustomerLine customers; private boolean servingCustomerLine = true; public Teller(CustomerLine cq) { customers = cq; } public void run О { try {

while(IThread.interruptedO) {

Customer customer = customers.takeO. Ti meUni t.MILLISECONDS.s1eep(

customer. getServiceTimeO); synchronized(this) {

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

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

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