- •Многопоточное программирование
- •Цели занятия
- •Понятие многопоточности
- •Реализация многопоточности
- •Реализация многопоточности
- •Особенности многопоточности
- •Использование класса Thread
- •Использование класса Thread
- •Использование класса Thread
- •Использование интерфейса
- •Использование интерфейса
- •Управление потоками
- •Нерекомендуемые действия над
- •Группы потоков
- •Группы потоков
- •Операции в группе потоков
- •Приоритеты потоков
- •Приоритеты потоков
- •Демон-потоки
- •Демон-группы потоков
- •Совместное использование
- •Совместное использование
- •Совместное использование
- •Совместное использование
- •Характерные ошибки
- •volatile
- •volatile
- •Специальные методы класса
- •Особенности использования
- •Прерывание потока
- •Пример
- •Пример
- •Пример
- •java.util.concurrent
- •java.util.concurrent
- •java.util.concurrent.locks
- •Lock Objects
- •ReentrantLock
- •Пример ReentrantLock
- •ReadWriteLock
- •Пример ReadWriteLock
- •Исполнители (Executors)
- •Интерфейсы исполнителей
- •Интерфейс Executor
- •Интерфейс
- •Thread Pools
- •Thread Pools
- •Executors
- •Пример ExecutorService
- •Пример ExecutorService.invokeAll()
- •InterruptedException
- •Прерывание потока
- •Пример InterruptedException
- •Пример восстановления статуса
- •Пример отменяемой задачи
- •Литература
Пример
31 Пример 2
class VectorSynchronizer { private double [] v;
private volatile int current = 0; private Object lock = new Object(); private boolean set = false;
public VectorSynchronizer(double [] v) { this.v = v;
}
public boolean canRead() { return current < v.length;
}
public boolean canWrite() {
return (!set && current < v.length) || (set && current < v.length - 1);
}
Все права защищены. www.haulmont.ru info@haulmont.com |
© HAULMONT, 2013 |
Пример
32Пример 2
public double read() throws InterruptedException { double val;
synchronized (lock) { if (!canRead()) {
throw new InterruptedException();
}
while (!set) { lock.wait();
}
val = v[current++]; System.out.println("Read: " + val); set = false;
lock.notifyAll();
}
return val;
}
Все права защищены. www.haulmont.ru info@haulmont.com |
© HAULMONT, 2013 |
Пример
33 Пример 2
public void write(double val) throws InterruptedException { synchronized (lock) {
if (!canWrite()) {
throw new InterruptedException();
}
while (set) { lock.wait();
}
v[current]= val; System.out.println("Write: " + val); set = true;
lock.notifyAll();
}
}
}
Все права защищены. www.haulmont.ru info@haulmont.com |
© HAULMONT, 2013 |
java.util.concurrent
34
Все права защищены. www.haulmont.ru info@haulmont.com |
© HAULMONT, 2013 |
java.util.concurrent
35
•Concurrent Collections — набор коллекций, более эффективно работающие в многопоточной среде нежели стандартные универсальные коллекции из
java.util пакета, где вместо базовой обертки Collections.synchronizedList()
с блокированием доступа ко всей коллекции используются блокировки по сегментам данных или же оптимизируется работа для параллельного чтения данных
•Queues — неблокирующие (направлены на скорость и работу без блокирования потоков) и блокирующие (используются, когда нужно «притормозить» потоки чтения или записи, если не выполнены какие-либо условия, например, очередь пуста или переполнена, или же нет свободного читателя) очереди с поддержкой многопоточности
•Synchronizers — вспомогательные утилиты для синхронизации потоков, которые представляют собой мощное оружие в параллельных вычислениях.
•Executors — содержит в себе отличные фрейморки для создания пулов потоков, планирования работы асинхронных задач с получением результатов
•Locks — представляет собой альтернативные и более гибкие механизмы синхронизации потоков по сравнению с базовыми synchronized(), wait(), notify(), notifyAll()
•Atomics — классы с поддержкой атомарных операций над примитивами и ссылками
Все права защищены. www.haulmont.ru info@haulmont.com |
© HAULMONT, 2013 |
java.util.concurrent.locks
36
•В пакете содержатся интерфейсы и классы, служащие основой для блокировки и ожидания условий, которая отличается от встроенной синхронизации и мониторов
•Структура дает гораздо большую гибкость в использовании блокировок и условий за счет более богатого синтаксиса.
•Интерфейс Lock поддерживает правила блокировки, которые отличаются по семантике (reentrant, fair и т.д.) и которые могут быть использованы в не блочно-структурированных контекстах, в том числе в алгоритмах передачи или сортировки блокировок (основная реализация ReentrantLock)
•Интерфейс ReadWriteLock аналогично определяет блокировки, которые могут разделяться между потребителями, но являются исключительными для создателей (представлена только одна реализации ReentrantReadWriteLock, поскольку она охватывает большинство стандартных условий использования, но программисты могут создавать свои собственные реализации для покрытия нестандартных требований)
•Condition интерфейс описывает переменные состояния, которые могут быть связаны с объектами блокировок:
Они похожи по использованию на неявные мониторы, доступные посредством Object.wait(), но предлагают расширенные возможности
В частности, несколько объектов Condition могут быть связаны с одной блокировкой
Чтобы избежать проблемы совместимости, имена методов Condition отличаются от соответствующих методов Object
Все права защищены. www.haulmont.ru info@haulmont.com |
© HAULMONT, 2013 |
|
Синхронизаторы |
37 |
Класс AbstractQueuedSynchronizer служит полезным |
• |
|
|
суперклассом для определения блокировок и других |
|
синхронизаторов, которые полагаются на очереди |
|
заблокированных потоков |
• |
Класс AbstractQueuedLongSynchronizer обеспечивает ту же |
|
функциональность, но расширяет поддержку 64-битное |
|
состояния синхронизации |
• |
Оба расширяют класс AbstractOwnableSynchronizer, |
|
простой класс, который помогает записывать поток, который |
|
в настоящее время держит эксклюзивную синхронизацию |
• |
Класс LockSupport обеспечивает поддержку блокировок и |
|
разблокировок более низкого уровня, что будет полезно для |
|
разработчиков, реализующих свои собственные |
|
индивидуальные классы блокировок |
Все права защищены. www.haulmont.ru info@haulmont.com |
© HAULMONT, 2013 |
Lock Objects
38
•Синхронизированный код основывается на простейшего вида реентерабельной блокировке, она проста в использовании, но имеет много ограничений
•Более сложные блокирующие подходы поддерживаются пакетом java.util.concurrent.locks.
•Объекты Lock работают подобно неявным блокировкам, используемым синхронизированным кодом
•Как и в неявных блокировках, только один поток может владеть объектом Lock в одно и тоже время
•Объекты Lock также поддерживают механизм ожидания/уведомления, через связанные с ними состояния объектов.
•Самым большим преимуществом объектов Lock над неявной блокировкой является их способность вернуться из попытки получения блокировки:
Метод tryLock() откатывает попытку, если блокировка не доступна сразу или по истечении времени ожидания (если оно указано)
Метод lockInterruptibly() откатывается, если другой поток посылает прерывание перед наложением блокировки
Все права защищены. www.haulmont.ru info@haulmont.com |
© HAULMONT, 2013 |
ReentrantLock
39
• Реентерабельная взаимоисключающая блокировка с тем же основным поведением и семантикой, что предоставляются неявными блокировками, получаемыми с помощью синхронизированных методов и блоков, но с расширенными возможностями
• Объектом ReentrantLock владеет поток, последним наложивший успешно блокировку, но еще не разблокировавший объект блокировки
• Поток, пытающийся наложить блокировку, успешно продолжит выполнение с наложением блокировки, если объект блокировки не принадлежит другому потоку
• Попытка немедленно завершается, если текущий поток уже владеет блокировкой
• Это можно проверить с помощью методов isHeldByCurrentThread() и getHoldCount()
Все права защищены. www.haulmont.ru info@haulmont.com |
© HAULMONT, 2013 |
Пример ReentrantLock
40
Пример 3
public boolean impendingBow(Friend bower) { Boolean myLock = false;
Boolean yourLock = false; try {
myLock = lock.tryLock(); yourLock = bower.lock.tryLock();
} finally {
if (!(myLock && yourLock)) { if (myLock) {
lock.unlock();
}
if (yourLock) { bower.lock.unlock();
} } }
return myLock && yourLock;
}
Все права защищены. www.haulmont.ru info@haulmont.com |
© HAULMONT, 2013 |
