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

Интерфейс Delayed содержит единственный метод getDelay(), который сообщает, сколько времени осталось до истечения задержки или как давно задержка истекла. Метод заставляет нас использовать класс TimeUnit, потому что его аргумент относится именно к этому типу. Впрочем, этот класс очень удобен, поскольку он позволяет легко преобразовывать единицы без каких-либо вычислений. Например, значение delta хранится в миллисекундах, а метод Java SE5 System.nanoTime() выдает значение в наносекундах. Чтобы преобразовать значение delta, достаточно указать исходные и итоговые единицы:

NANOSECONDS.convert(delta. MILL ISECONDS);

В getDelay() желаемые единицы передаются в аргументе unit. Аргумент используется для преобразования времени задержки во временные единицы, используемые вызывающей стороной.

Для выполнения сортировки интерфейс Delayed также наследует интерфейс Comparable, поэтому необходимо реализовать метод compareToQ для выполнения осмысленных сравнений. Методы toStringO и summary() обеспечивают форматирование вывода.

Из выходных данных видно, что порядок создания задач не влияет на порядок их выполнения — вместо этого задачи, как и предполагалось, выполняются в порядке следования задержек.

PriorityBlockingQueue

Фактически класс PriorityBlockingQueue представляет приоритетную очередь с блокирующими операциями выборки. В следующем примере объектами в приоритетной очереди являются задачи, покидающие очередь в порядке приоритетов. Для определения этого порядка в класс PrioritizedTask включается поле priority:

//: concurrency/PriorityBlockingQueueDemo.java import java.util.concurrent.*; import java.util.*;

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

class PrioritizedTask implements Runnable, Comparable { private Random rand = new Random(47); private static int counter = 0; private final int id = counter++; private final int priority; protected static List sequence =

new ArrayLi st(); public PrioritizedTask(int priority) { this.priority = priority; sequence.add(this);

}

public int compareTo(PrioritizedTask arg) { return priority < arg.priority ? 1 ;

(priority > arg.priority ? -1 : 0);

}

public void run() { try {

Ti mellni t. MILLI SECONDS. s 1 eep (rand. next I nt (250)); } catch(InterruptedException e) {

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

}

print(this);

}

public String toStringO {

return String, format С [n$-3d]\ priority) + " Task " + id;

}

public String summaryО {

return "(" + id + ":" + priority + ")";

}

public static class EndSentinel extends PrioritizedTask { private ExecutorService exec; public EndSentinel(ExecutorService e) {

super(-l); // Минимальный приоритет в этой программе

exec = e;

public void run() {

int count = 0;

for(PrioritizedTask pt : sequence) { printnb(pt.summaryO), if(++count % 5 == 0) printO.

}

printO;

print (this + " Calling shutdownNowO"); exec.shutdownNowO.

}

}

}

class PrioritizedTaskProducer implements Runnable { private Random rand = new Random(47); private Queue queue; private ExecutorService exec; public PrioritizedTaskProducer(

Queue q, ExecutorService e) { queue = q;

exec = e; // Используется для EndSentinel

}

public void run() {

// Неограниченная очередь без блокировки. // Быстрое заполнение случайными приоритетами: for(int i = 0; i < 20; i++) {

queue.add(new PrioritizedTask(rand.nextInt(10))); Thread.yieldO;

}

// Добавление высокоприоритетных задач: try {

for(int i = 0; i < 10; i++) {

TimeUnit.MILLISECONDS.sleep(250); queue.add(new PrioritizedTask(lO)).

}

// Добавление заданий, начиная с наименьших приоритетов: for(int i = 0; i < 10; i++)

queue.add(new PrioritizedTask(i)); // Предохранитель для остановки всех задач: queue.add(new PrioritizedTask EndSentinel(exec)); } catchdnterruptedException e) {

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

}

print("Завершение PrioritizedTaskProducer");

}

}

class PrioritizedTaskConsumer implements Runnable { private PriorityBlockingQueue q; public PrioritizedTaskConsumer(

PriorityBlockingQueue q) { this.q = q;

}

public void run() {

while('Thread interruptedO)

// Использование текущего потока для запуска задачи q.takeO run(). } catch(InterruptedException e) {

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

}

print("Завершение PrioritizedTaskConsumer").

}

}

public class PriorityBlockingQueueDemo {

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

ExecutorService exec = Executors newCachedThreadPoolО, PriorityBlockingQueue queue =

new PriorityBlockingQueue(); exec execute(new PrioritizedTaskProducer(queue. exec)), exec execute(new PrioritizedTaskConsumer(queue)),

}

} ///:-

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

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

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

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

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

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

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

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

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