410 likes | 783 Views
Java Advanced. Многопоточное программирование на Java. http://kgeorgiy.info/courses/java-advanced/. Содержание. Многопоточные коллекции Управление заданиями Уровни безопасности Дополнительные возможности. Concurrency Utilities. Набор классов, облегчающих написание многопоточных программ
E N D
Java Advanced Многопоточное программирование на Java http://kgeorgiy.info/courses/java-advanced/
Содержание • Многопоточные коллекции • Управление заданиями • Уровни безопасности • Дополнительные возможности Java Advanced / Многопоточное программирование на Java
Concurrency Utilities • Набор классов, облегчающих написание многопоточных программ • Пакет java.util.concurrent.locks • Работа с блокировками • Пакет java.util.concurrent.atomic • Атомарные переменные • Пакет java.util.concurrent • Примитивы синхронизации • Многопоточные коллекции • Управление заданиями Java Advanced / Многопоточное программирование на Java
Часть 1 Многопоточные коллекции Java Advanced / Многопоточное программирование на Java
Многопоточные очереди • Интерфейсы • BlockingQueue • BlockingDeque • Семантика чтения-записи • Возможно ограничение размера Java Advanced / Многопоточное программирование на Java
Свойства • Массовые операции • remainingCapacity() – свободное место • drainTo(Collection) – получение всех элементов • drainTo(Collection, max) – получение max элементов • Особенности • Неэффективность произвольного доступа • Неатомарность массовых операций Java Advanced / Многопоточное программирование на Java
Производитель-потребитель (1) • Производитель void run() { try { while (true) { E e; // Создание элемента queue.put(e); } } catch (InterruptedException e) { } } Java Advanced / Многопоточное программирование на Java
Производитель-потребитель (2) • Потребитель void run() { try { while (true) { E e = queue.take(); // Обработка элемента } } catch (InterruptedException e) { } } Java Advanced / Многопоточное программирование на Java
Реализации BlockingQueue • ArrayBlockingQueue – очередь на массиве • LinkedBlockingQueue/Deque – очереди на списках • PriorityBlockingQueue – очередь на хипе • SynchronousQueue – очередь без «внутренности» Java Advanced / Многопоточное программирование на Java
Многопоточные отображения (1) • Представляются интерфейсом ConcurrentMap<K, V> • Дополнительные методы • putIfAbsent(K, V) – добавляет отображение K, если его ранее не было • remove(K, V) – удаляет K, если он отображен на V • replace(K, V) – заменяет отображение K • replace(K, oldV, newV) – условная замена отображения для ключа K Java Advanced / Многопоточное программирование на Java
Многопоточные отображения (2) • Класс ConcurrentHashMap • Неблокирующее чтение • Частично блокирующая запись • Lock striping Java Advanced / Многопоточное программирование на Java
Другие многопоточные коллекции • Коллекции с многопоточным доступом • ConcurrentLinkedQueue – очередь на списке • ConcurrentSkipListSet/Map – упорядоченное множество/отображение • Коллекции, «самокопирующиеся» призаписи • CopyOnWriteArrayList – список на массиве • CopyOnWriteArraySet – множество на массиве Java Advanced / Многопоточное программирование на Java
Часть 2 Управление заданиями Java Advanced / Многопоточное программирование на Java
Исполнители (1) • Интерфейс Executor • execute(Runnable) – выполнить задание • Возможные варианты выполнения • В том же потоке • Во вновь создаваемом потоке • Пул потоков • Наращиваемый пул потоков Java Advanced / Многопоточное программирование на Java
Функции и результаты • Интерфейс Callable<V> – функция • V call() – подсчитать функцию • Интерфейс Future<V> – результат • get(timeout?) – получить результат • isDone() – окончено ли выполнение • cancel(mayInterruptWhenRunning) – прервать выполнение • isCancelled() – прервано ли выполнение Java Advanced / Многопоточное программирование на Java
Исполнители (2) • Интерфейс ExecutorService • submit(Runnable) – выполнить задание • Future<V> submit(Callable<V>) – выполнить функцию • List<Future> invokeAll(List<Callable>) – выполнить все функции • Future invokeAny(List<Callable>) – успешно выполнить функцию Java Advanced / Многопоточное программирование на Java
Завершение работы • shutdown() – прекратить прием заданий • List<Runnable> shutdownNow() – прекратить выполнение • isShutdown() – прекращен ли прием • isTerminated() – окончен ли все задания • awaitTermination(timeout) – ожидание завершения Java Advanced / Многопоточное программирование на Java
Реализация исполнителей • Класс ThreadPoolExecutor • corePoolSize – минимальное количество потоков • maxPoolSize максимальное количество потоков • blockingQueue – очередь заданий • keepAliveTime – время жизни потока • threadFactory – фабрика потоков • … Java Advanced / Многопоточное программирование на Java
Отклонение заданий • Нет свободного потока и места в очереди • Политики отклонения • AbortPolicy – бросить RejectedExecutionException • CallerRunsPolicy – исполнить в вызывающем потоке • DiscardPolicy – проигноировать • DiscardOldestPolicy – заменить самое давнее • Интерфейс RejectedExecutionHandler Java Advanced / Многопоточное программирование на Java
Отложенное исполнение • Интерфейс ScheduledExecutorService • schedule(callable, timeout) – исполнить через timeout • schedule(runnable, timeout?) – исполнить через timeout • sheduleAtFixedRate(runnable, initialDelay, period) – периодическое исполнение • scheduleWithFixedDelay(runnable, initialDelay, delay)– исполнение с равными интервалами • Все методы возвращают ScheduledFuture Java Advanced / Многопоточное программирование на Java
Реализация отложенного исполнения • Класс ScheduledThreadPoolExecutor Java Advanced / Многопоточное программирование на Java
Класс Executors • Создание исполнителей • newCachedThreadPool() • newFixedThreadPool(n) • newSingleThreadExecutor() • Создание фабрик потоков • Класс ThreadFactory • Создание привилегированных действий и фабрик потоков • Наследую права создавшего Java Advanced / Многопоточное программирование на Java
Часть 3 Уровни безопасности Java Advanced / Многопоточное программирование на Java
Неизменяемые • Не изменяются с момента создания • Все поля final • Ссылаются только на неизменяемые объекты • Потокобезопасны • Синхронизация не требуется • Immutable Java Advanced / Многопоточное программирование на Java
Эффективно неизменяемые • Не изменяются с определенного момента • Вся инициализация в одном потоке • Ссылаются только на (эффективно) неизменяемые объекты • Потокобезопасны • Корректно опубликованы • Effective immutable Java Advanced / Многопоточное программирование на Java
Корректная публикация • Корректное получение ссылки на объект • Полностью инициализирован • Опубликован с барьером • Получен с барьером • Ссылки до окончания конструктора • Переопределяемые методы • Регистрация слушателей Java Advanced / Многопоточное программирование на Java
Потокобезопасные • Внутренняя синхронизация • Для одиночных операций синхронизация не требуется • Внешняя синхронизация при массовых операциях • Thread-safe Java Advanced / Многопоточное программирование на Java
Условно потокобезопасные • Внешняя синхронизация • Синхронизация требуется для всех операций • Ответственность на вызывающем • Conditionally thread-safe Java Advanced / Многопоточное программирование на Java
Потоконебезопасные • Не могут использоваться в многопоточной среде • Патологический случай • Надо избегать • Thread-hostile Java Advanced / Многопоточное программирование на Java
Делегирование • Одно поле • Ссылка не изменяется • Потокобезопасный объект • Атомарные или независимые операции • Можно делегировать всю синхронизацию Java Advanced / Многопоточное программирование на Java
Привязка к потоку • Один поток – один экземпляр • Thead-local objects • Проблемы с взаимодействием Java Advanced / Многопоточное программирование на Java
Thread-local objects • Существует по одному на каждый поток • Каждый может использовать безопасно • Доступ • Идентификатор • Чтение локального объекта • Запись локального объекта Java Advanced / Многопоточное программирование на Java
Класс ThreadLocal • Конструкторы • TheadLocal() – новый идентификатор • Методы • get() – чтение • set(value) – запись • remove() – удаление • Наследование • initialValue() – исходное значение Java Advanced / Многопоточное программирование на Java
Часть 4 Дополнительные возможности Java Advanced / Многопоточное программирование на Java
Интервалы времени • Перечисление TimeUnit • SECONDS • MILLISECONDS • MICROSECONDS • NANOSECONDS • Интервалы задаются парой • Значение • Единица измерения Java Advanced / Многопоточное программирование на Java
Очереди с задержкой • Класс DelayQueue • Интерфейс Delayed • getDelay(unit) – получить остаток задержки Java Advanced / Многопоточное программирование на Java
Асинхронное вычисление • Класс FutureTask • Методы • run() – посчитать • get(timeout?) – получить результат • isDone()– проверить завершение • cancel() – отменить • isCancelled() – проверить, что отменилось Java Advanced / Многопоточное программирование на Java
Очереди заданий • Интерфейс CompletionService • Методы • submit(Callable)/submit(Runnable, result)– создать задание • poll(timeout?)/ take() – получить результат задания • Реализация • ExecutorCompletionService Java Advanced / Многопоточное программирование на Java
Часть 7 Заключение Java Advanced / Многопоточное программирование на Java
Ссылки • JSR 166: Concurrency Utilities // http://jcp.org/en/jsr/detail?id=166 • Concurrent Programming with J2SE 5.0 // http://java.sun.com/developer/technicalArticles/J2SE/concurrency/ • Getting to know synchronizers http://java.sun.com/developer/JDCTechTips/2005/tt0216.html#1 Java Advanced / Многопоточное программирование на Java
Вопросы Java Advanced / Многопоточное программирование на Java