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

int nHorses = 7;

int pause = 200,

if(args.length > 0) { // Необязательный аргумент int n = new Integer(args[0J); nHorses = n > 0 ? n . nHorses,

}

if(args length > 1) { // Необязательный аргумент int p = new Integer(args[l]); pause = p > -1 ? p : pause;

}

new HorseRace(nHorses, pause);

}

} ///;-

Для объекта CyclicBarrier можно задать «барьерное действие» — объект Runnable, автоматически запускаемый при обнулении счетчика (еще одно отличие CyclicBarrier от CountdownLatch). В нашем примере барьерное действие определяется в виде безымянного класса, передаваемого конструктору CyclicBarrier.

Я попытался сделать так, чтобы каждый объект лошади отображал себя, но порядок отображения зависел от диспетчера задач. Благодаря CyclicBarrier каждая лошадь делает то, что ей необходимо для продвижения вперед, а затем ожидает у барьера перемещения всех остальных лошадей. Когда все лошади переместятся, CyclicBarrier автоматически вызывает «барьерную» задачу Runnable, чтобы отобразить всех лошадей по порядку вместе с барьером. Как только все задачи пройдут барьер, последний автоматически становится готовым для следующего захода.

DelayQueue

Класс представляет неограниченную блокирующую очередь объектов, реализующих интерфейс Delayed. Объект может быть извлечен из очереди только после истечения задержки. Очередь сортируется таким образом, что объект в начале очереди обладает наибольшим сроком истечения задержки. Если задержка ни у одного объекта не истекла, начального элемента нет, и вызов poll() возвращает null (из-за этого в очередь не могут помещаться элементы null).

В следующем примере объекты, реализующие Delayed, сами являются задачами, a DelayedTaskContainer берет задачу с наибольшей просроченной задержкой и запускает ее. Таким образом, DelayQueue является разновидностью приоритетной очереди.

//• concurrency/DelayQueueDemo java import java util concurrent *; import java util *.

import static java util concurrent TimeUnit *, import static net mindview.util Print *;

class DelayedTask implements Runnable, Delayed { private static int counter = 0; private final int id = counter++, private final int delta; private final long trigger; protected static List sequence =

new ArrayList(), public DelayedTask(int delaylnMilliseconds) { delta = delaylnMilliseconds, trigger = System nanoTimeO +

NANOSECONDS.convert(delta. MILLISECONDS). sequence add(this),

}

public long getDelay(TimeUnit unit) { return unit.convert(

trigger - System.nanoTime(), NANOSECONDS),

}

public int compareTo(Delayed arg) {

DelayedTask that = (DelayedTask)arg, if(trigger < that.trigger) return -1; if(trigger > that.trigger) return 1, return 0;

}

public void run() { printnb(this + " "), } public String toStringO {

return String.format("[£l$-4d]\ delta) + " Task " + id;

}

public String summaryО {

return "(" + id + + delta + ")";

}

public static class EndSentinel extends DelayedTask { private ExecutorService exec; public EndSentinel(int delay. ExecutorService e) { super(delay), exec = e;

}

public void runO {

for(DelayedTask pt . sequence) {

printnb(pt.summary() + " ");

}

printO;

print (this + " вызывает shutdownNowO"); exec.shutdownNowO;

}

}

}

class DelayedTaskConsumer implements Runnable { private DelayQueue q, public DelayedTaskConsumer(DelayQueue q) { this.q = q;

public void run() { try {

while(IThread interruptedO)

q.takeO.runО; // Выполнение задачи в текущем потоке } catchdnterruptedException е) {

// Приемлемый вариант выхода

}

print("Завершается DelayedTaskConsumer");

public class DelayQueueDemo {

public static void main(String[] args) { Random rand = new Random(47),

ExecutorService exec = Executors newCachedThreadPoolО; DelayQueue<@060>DelayedTask> queue =

new DelayQueue(); // Очередь заполняется задачами со случайной задержкой-for(int i = 0; i < 20; i++)

queue put(new DelayedTask(rand.nextInt(5000))); // Назначение точки остановки queue.add(new DelayedTask.EndSentinel(5000, exec)); exec.execute(new DelayedTaskConsumer(queue)),

}

} /* Output;

[128 ] Task 11 [200 ] Task 7 [429 ] Task 5 [520 ] Task 18 [555 ] Task 1 [961 ] Task 4 [998 ] Task 16 [1207] Task 9 [1693] Task 2 [1809] Task 14 [1861] Task 3 [2278] Task 15 [3288] Task 10 [3551] Task 12 [4258] Task 0 [4258] Task 19 [4522] Task 8 [4589] Task 13 [4861] Task 17 [4868] Task 6 (0:4258) (1.555) (2:1693) (3-1861) (4.961) (5:429) (6:4868) (7:200) (8:4522) (9:1207) (10:3288) (11:128) (12:3551) (13.4589) (14.1809) (15-2278) (16:998) (17:4861) (18:520) (19:4258) (20:5000) [5000] Task 20 вызывает shutdownNowO Завершается DelayedTaskConsumer *///.-

DelayedTask содержит контейнер List с именем sequence, в котором сохраняется порядок создания задач, и мы видим, что сортировка действительно выполняется.

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

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

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

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

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

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

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

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

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