русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

DelayQueue


Дата добавления: 2015-06-12; просмотров: 1177; Нарушение авторских прав


Класс представляет неограниченную блокирующую очередь объектов, реализующих интерфейс 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<DelayedTask> sequence =

new ArrayList<DelayedTask>();

public DelayedTask(int delayInMilliseconds) {

delta = delayInMilliseconds;

trigger = System.nanoTime() +

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 toString() {

return String.format("[%1$-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 run() {

for(DelayedTask pt : sequence) {

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

}

print();

print(this + " Calling shutdownNow()");

exec.shutdownNow();

}

}

}

 

class DelayedTaskConsumer implements Runnable {

private DelayQueue<DelayedTask> q;

public DelayedTaskConsumer(DelayQueue<DelayedTask> q) {

this.q = q;

}

public void run() {

try {

while(!Thread.interrupted())

q.take().run(); // Выполнение задачи в текущем потоке

} catch(InterruptedException e) {

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

}

print("Finished DelayedTaskConsumer");

}

}

 

public class DelayQueueDemo {

public static void main(String[] args) {

Random rand = new Random(47);

ExecutorService exec = Executors.newCachedThreadPool();

DelayQueue<DelayedTask> queue =

new DelayQueue<DelayedTask>();

// Очередь заполняется задачами со случайной задержкой:

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));

}

}

<spoiler text="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 Calling shutdownNow()

Finished DelayedTaskConsumer

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

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

NANOSECONDS.convert(delta. MILL ISECONDS);

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

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

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



<== предыдущая лекция | следующая лекция ==>
CyclicBarrier | PriorityBlockingQueue


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 1.548 сек.