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

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

Жанры

Философия Java3

Эккель Брюс

Шрифт:

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<Teller> { 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) {

customersServed++; while(IservingCustomerLine) waitO;

}

}

} catchdnterruptedException e) {

System out println(this + "прерван");

}

System out.println(this + "завершается");

}

public synchronized void doSomethingElseO { customersServed = 0; servingCustomerLine = false;

}

public synchronized void serveCustomerLineO {

assert IservingCustomerLine:"уже обслуживает: " + this; servingCustomerLine = true; notifyAl 10;

}

public String toStringO { return "Кассир " + id + " "; } public String shortStringO { return "K" + id. } // Используется приоритетной очередью: public synchronized int compareTo(Teller other) {

return customersServed < other customersServed ?
– 1 .

(customersServed == other.customersServed ? 0 . 1);

}

}

class TellerManager implements Runnable { private ExecutorService exec, private CustomerLine customers; private PriorityQueue<Teller> workingTellers =

new PriorityQueue<Teller>; private Queue<Teller> tellersDoingOtherThings =

new LinkedList<Tel 1 er>; private int adjustmentPeriod. private static Random rand = new Random(47); public TellerManager(ExecutorService e,

CustomerLine customers, int adjustmentPeriod) { exec = e;

this.customers = customers;

this.adjustmentPeriod = adjustmentPeriod;

// Начинаем с одного кассира:

Teller teller = new Teller(customers);

exec.execute(teller);

workingTellers.add(teller);

}

public void adjustTellerNumberO {

// Фактически это система управления. Регулировка числовых // параметров позволяет выявить проблемы стабильности // в механизме управления.

// Если очередь слишком длинна, добавить другого кассира: if(customers.size / workingTellers.sizeO > 2) { // Если кассиры отдыхают или заняты // другими делами,

вернуть одного из них: if(tellersDoingOtherThings.size > 0) {

Teller teller = tellersDoingOtherThings.remove; tel1er.serveCustomerLi ne; workingTellers.offer(teller); return;

}

// Иначе создаем (нанимаем) нового кассира Teller teller = new Teller(customers); exec.execute(teller); workingTellers.add(teller); return;

}

// Если очередь достаточно коротка, освободить кассира: if (workingTellers.sizeO > 1 &&

customers.size / workingTellers.sizeO < 2) reassignOneTellerO; // Если очереди нет. достаточно одного кассира: if (customers, si ze ==0)

while(workingTellers.size > 1) reassignOneTellerO;

}

// Поручаем кассиру другую работу или отправляем его отдыхать: private void reassignOneTellerO {

Teller teller = workingTellers.pollО;

tel 1 er. doSomethi ngEl seO,

tel1ersDoi ngOtherThi ngs.offer(tel1er);

}

public void runO { try {

while(!Thread.interruptedO) {

TimeUnit.MILLISECONDS.sleep(adjustmentPeriod);

adjustTellerNumberO;

System.out.print(customers +"{");

for(Teller teller workingTellers)

System.out.print(teller.shortString + " "); System.out.printIn("}"); } продолжение &

} catchdnterruptedException е) {

System.out.printin(this + "прерван");

}

System.out println(this + "завершается");

}

public String toStringO { return "TellerManager "; }

}

public class BankTellerSimulation {

static final int MAX_LINE_SIZE = 50;

static final int ADJUSTMENT_PERIOD = 1000;

public static void main(String[] args) throws exception {

ExecutorService exec = Executors.newCachedThreadPoolО; // Если очередь слишком длинна, клиенты уходят: CustomerLine customers =

new CustomerLi ne(MAX_LINE_SIZE); exec.execute(new CustomerGenerator(customers)); // TellerManager добавляет и убирает кассиров // по мере необходимости: exec.execute(new TellerManager(

exec, customers. ADJUSTMENT_PERIOD)); if(args.length > 0) // Необязательный аргумент

Ti meUni t.SECONDS.s1eep(new Integer(args[0])).

else {

System.out.printIn("Press 'Enter' to quit"); System.in.readО;

}

exec.shutdownNowO;

}

} /* Output:

[429][200][207] { K0 K1 } [861][258][140][322] { K0 K1 } [575][342][804][826][896][984] { КО K1 K2 } [984][810][141][12][689][992][976][368][395][354] { КО K1 K2 КЗ } Teller 2 прерван Teller 2 завершается Teller 1 прерван Teller 1 завершается TellerManager прерван TellerManager завершается Teller 3 прерван Teller 3 завершаетсяч Teller 0 прерван Teller 0 завершается CustomerGenerator прерван CustomerGenerator завершается *///:-

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

Воронцов. Перезагрузка. Книга 2

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

Я бог. Книга XXXIX

Дрейк Сириус
39. Дорогой барон!
Фантастика:
юмористическое фэнтези
аниме
попаданцы
5.00
рейтинг книги
Я бог. Книга XXXIX

История Похитителя Тел

Райс Энн
4. Хроники вампиров
Фантастика:
ужасы и мистика
8.87
рейтинг книги
История Похитителя Тел

"Фантастика 2024-147".Компиляция. Книги 1-28

Погуляй Юрий Александрович
Фантастика 2024. Компиляция
Фантастика:
фэнтези
боевая фантастика
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Фантастика 2024-147.Компиляция. Книги 1-28

Мир в подарок. Трилогия

Демченко Оксана Б.
124. В одном томе
Фантастика:
фэнтези
8.87
рейтинг книги
Мир в подарок. Трилогия

Одержимый

Джеймс Питер
Top Thriller
Детективы:
триллеры
маньяки
8.67
рейтинг книги
Одержимый

Архивариус

alchoz
Проект «Поттер-Фанфикшн»
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Архивариус

Дважды одаренный. Том VI

Тарс Элиан
6. Дважды одаренный
Фантастика:
аниме
альтернативная история
фэнтези
фантастика: прочее
5.25
рейтинг книги
Дважды одаренный. Том VI

"Самая страшная книга-4". Компиляция. Книги 1-16

Коллектив авторов
Самая страшная книга
Фантастика:
городское фэнтези
мистика
ужасы и мистика
5.00
рейтинг книги
Самая страшная книга-4. Компиляция. Книги 1-16

Записки брюнетки

Голубицкая Жанна
Проза:
современная проза
4.25
рейтинг книги
Записки брюнетки

Прорыв реальности

Бурносов Юрий Николаевич
Новая зона
Фантастика:
боевая фантастика
6.40
рейтинг книги
Прорыв реальности

Презумпция виновности

Шульгина Анна
3. Научный подход
Любовные романы:
современные любовные романы
9.36
рейтинг книги
Презумпция виновности

Повелитель Орлов. Дилогия (самое полное издание с концовками Том 1, Том 2)

Смолин Александр
Повелитель Орлов
Фантастика:
фэнтези
эпическая фантастика
героическая фантастика
боевая фантастика
6.80
рейтинг книги
Повелитель Орлов. Дилогия (самое полное издание с концовками Том 1, Том 2)

Приход ночи

Азимов Айзек
Фантастика:
научная фантастика
7.73
рейтинг книги
Приход ночи