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

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

Жанры

Философия Java3

Эккель Брюс

Шрифт:

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<Pri ori ti zedTask> { private Random rand = new Random(47); private static int counter = 0; private final int id = counter++; private final int priority; protected static List<PrioritizedTask> sequence =

new ArrayLi st<Pri ori ti zedTask>; 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<Runnable> queue; private ExecutorService exec; public PrioritizedTaskProducer(

Queue<Runnable> 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<Runnable> q; public PrioritizedTaskConsumer(

PriorityBlockingQueue<Runnable> 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<Runnable> queue =

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

}

} ///:-

Как и в предыдущем примере, последовательность создания объектов PrioritizedTask сохраняется в контейнере List sequence для сравнения с фактическим порядком выполнения. Метод run делает небольшую паузу, а затем выводит информацию об объекте, а предохранитель EndSentinel выполняет те же функции, что и прежде.

PrioritizedTaskProducer и PrioritizedTaskConsumer связываются друг с другом через PriorityBlockingQueue. Так как сам блокирующий характер очереди обеспечивает всю необходимую синхронизацию, явная синхронизация не нужна — при чтении вам не нужно думать о том, содержит ли очередь элементы, потому что при отсутствии элементов очередь просто заблокирует читающую сторону.

Управление оранжереей на базе ScheduledExecutor

В главе 10 была представлена система управления гипотетической оранжереей, которая включала (отключала) различные устройства и регулировала их работу. Происходящее можно преобразовать в контекст многозадачности: каждое событие оранжереи представляет собой задачу, запускаемую в заранее заданное время. Класс ScheduledThreadPoolExecutor предоставляет именно тот сервис, который необходим для решения задачи. Используя методы schedule (однократный запуск задачи) или scheduleAtFixedRate (повторение задачи с постоянным промежутком), мы создаем объекты Runnable, которые должны запуститься в положенное время. Сравните это решение с тем, что приведено в главе 10, и посмотрите, насколько оно упрощается благодаря готовой функциональности ScheduledThreadPoolExecutor:

//: concurrency/GreenhouseScheduler.java

// Новая реализация innerclasses/GreenhouseController.java

// с использованием ScheduledThreadPoolExecutor.

// {Args- 5000}

import java.util.concurrent.*,

import java.util *;

public class GreenhouseScheduler {

private volatile boolean light = false, private volatile boolean water = false; private String thermostat = "Day", public synchronized String getThermostatO { return thermostat,

}

public synchronized void setThermostat(String value) { thermostat = value;

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

На границе империй. Том 10. Часть 6

INDIGO
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 10. Часть 6

Антимаг его величества. Том III

Петров Максим Николаевич
3. Модификант
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Антимаг его величества. Том III

Герой

Бубела Олег Николаевич
4. Совсем не герой
Фантастика:
фэнтези
попаданцы
9.26
рейтинг книги
Герой

Печать Пожирателя

Соломенный Илья
1. Пожиратель
Фантастика:
попаданцы
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Печать Пожирателя

На границе империй. Том 7. Часть 2

INDIGO
8. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
6.13
рейтинг книги
На границе империй. Том 7. Часть 2

Шайтан Иван 3

Тен Эдуард
3. Шайтан Иван
Фантастика:
попаданцы
альтернативная история
7.17
рейтинг книги
Шайтан Иван 3

Изгой Проклятого Клана. Том 2

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

Твое сердце будет разбито. Книга 1

Джейн Анна
Любовные романы:
современные любовные романы
5.50
рейтинг книги
Твое сердце будет разбито. Книга 1

Играть... в тебя

Зайцева Мария
3. Звериные повадки Симоновых
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Играть... в тебя

Князь

Шмаков Алексей Семенович
5. Светлая Тьма
Фантастика:
юмористическое фэнтези
городское фэнтези
аниме
сказочная фантастика
5.00
рейтинг книги
Князь

Приказано выжить!

Малыгин Владимир
1. Другая Русь
Фантастика:
боевая фантастика
попаданцы
альтернативная история
7.09
рейтинг книги
Приказано выжить!

Личный аптекарь императора

Карелин Сергей Витальевич
1. Личный аптекарь императора
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Личный аптекарь императора

Серпентарий

Мадир Ирена
Young Adult. Темный мир Шарана. Вселенная Ирены Мадир
Фантастика:
фэнтези
готический роман
5.00
рейтинг книги
Серпентарий

Цеховик. Книга 1. Отрицание

Ромов Дмитрий
1. Цеховик
Фантастика:
попаданцы
альтернативная история
5.75
рейтинг книги
Цеховик. Книга 1. Отрицание