Многопоточное программирование на Java Java Advanced
2 СПбГУ ИТМО Georgiy KorneevJava Advanced / Многопоточное программирование на Java Содержание 1. Многопоточные коллекции 2. Управление заданиями 3. Уровни безопасности 4. Дополнительные возможности
3 СПбГУ ИТМО Georgiy KorneevJava Advanced / Многопоточное программирование на Java Concurrency Utilities Набор классов, облегчающих написание многопоточных программ Пакет java.util.concurrent.locks Работа с блокировками Пакет java.util.concurrent.atomic Атомарные переменные Пакет java.util.concurrent Примитивы синхронизации Многопоточные коллекции Управление заданиями
Многопоточные коллекции Часть 1 Java Advanced / Многопоточное программирование на Java
5Georgiy Korneev Многопоточные очереди Интерфейсы BlockingQueue BlockingDeque Семантика чтения-записи Возможно ограничение размера Java Advanced / Многопоточное программирование на Java ДействиеИсклю- чение ЗначениеОжидание Вставкаadd(e)offer(е, time?)put(e) Чтениеelement()peek() Удалениеremove()poll(time?)take(e)
6Georgiy KorneevJava Advanced / Многопоточное программирование на Java Свойства Массовые операции remainingCapacity() – свободное место drainTo(Collection) – получение всех элементов drainTo(Collection, max) – получение max элементов Особенности Неэффективность произвольного доступа Неатомарность массовых операций
7Georgiy KorneevJava Advanced / Многопоточное программирование на Java Производитель-потребитель (1) Производитель void run() { try { while (true) { E e; // Создание элемента queue.put(e); } } catch (InterruptedException e) { }
8Georgiy KorneevJava Advanced / Многопоточное программирование на Java Производитель-потребитель (2) Потребитель void run() { try { while (true) { E e = queue.take(); // Обработка элемента } } catch (InterruptedException e) { }
9Georgiy KorneevJava Advanced / Многопоточное программирование на Java Реализации BlockingQueue ArrayBlockingQueue – очередь на массиве LinkedBlockingQueue/Deque – очереди на списках PriorityBlockingQueue – очередь на хипе SynchronousQueue – очередь без «внутренности»
10Georgiy KorneevJava Advanced / Многопоточное программирование на Java Многопоточные отображения (1) Представляются интерфейсом ConcurrentMap Дополнительные методы putIfAbsent(K, V) – добавляет отображение K, если его ранее не было remove(K, V) – удаляет K, если он отображен на V replace(K, V) – заменяет отображение K replace(K, oldV, newV) – условная замена отображения для ключа K
11Georgiy Korneev Многопоточные отображения (2) Класс ConcurrentHashMap Неблокирующее чтение Частично блокирующая запись Lock striping Java Advanced / Многопоточное программирование на Java
12Georgiy KorneevJava Advanced / Многопоточное программирование на Java Другие многопоточные коллекции Коллекции с многопоточным доступом ConcurrentLinkedQueue – очередь на списке ConcurrentSkipListSet/Map – упорядоченное множество/отображение Коллекции, «самокопирующиеся» при записи CopyOnWriteArrayList – список на массиве CopyOnWriteArraySet – множество на массиве
Управление заданиями Часть 2 Java Advanced / Многопоточное программирование на Java
14Georgiy KorneevJava Advanced / Многопоточное программирование на Java Исполнители (1) Интерфейс Executor execute(Runnable) – выполнить задание Возможные варианты выполнения В том же потоке Во вновь создаваемом потоке Пул потоков Наращиваемый пул потоков
15Georgiy KorneevJava Advanced / Многопоточное программирование на Java Функции и результаты Интерфейс Callable – функция V call() – подсчитать функцию Интерфейс Future – результат get(timeout?) – получить результат isDone() – окончено ли выполнение cancel(mayInterruptWhenRunning) – прервать выполнение isCancelled() – прервано ли выполнение
16Georgiy KorneevJava Advanced / Многопоточное программирование на Java Исполнители (2) Интерфейс ExecutorService submit(Runnable) – выполнить задание Future submit(Callable ) – выполнить функцию List invokeAll(List ) – выполнить все функции Future invokeAny(List ) – успешно выполнить функцию
17Georgiy Korneev Завершение работы shutdown() – прекратить прием заданий List shutdownNow() – прекратить выполнение isShutdown() – прекращен ли прием isTerminated() – окончен ли все задания awaitTermination(timeout) – ожидание завершения Java Advanced / Многопоточное программирование на Java
18Georgiy KorneevJava Advanced / Многопоточное программирование на Java Реализация исполнителей Класс ThreadPoolExecutor corePoolSize – минимальное количество потоков maxPoolSize максимальное количество потоков blockingQueue – очередь заданий keepAliveTime – время жизни потока threadFactory – фабрика потоков …
19Georgiy Korneev Отклонение заданий Нет свободного потока и места в очереди Политики отклонения AbortPolicy – бросить RejectedExecutionException CallerRunsPolicy – исполнить в вызывающем потоке DiscardPolicy – проигноировать DiscardOldestPolicy – заменить самое давнее Интерфейс RejectedExecutionHandler Java Advanced / Многопоточное программирование на Java
20Georgiy KorneevJava Advanced / Многопоточное программирование на Java Отложенное исполнение Интерфейс ScheduledExecutorService schedule(callable, timeout) – исполнить через timeout schedule(runnable, timeout?) – исполнить через timeout sheduleAtFixedRate(runnable, initialDelay, period) – периодическое исполнение scheduleWithFixedDelay(runnable, initialDelay, delay) – исполнение с равными интервалами Все методы возвращают ScheduledFuture
21Georgiy KorneevJava Advanced / Многопоточное программирование на Java Реализация отложенного исполнения Класс ScheduledThreadPoolExecutor
22Georgiy KorneevJava Advanced / Многопоточное программирование на Java Класс Executors Создание исполнителей newCachedThreadPool() newFixedThreadPool(n) newSingleThreadExecutor() Создание фабрик потоков Класс ThreadFactory Создание привилегированных действий и фабрик потоков Наследую права создавшего
Уровни безопасности Часть 3 Java Advanced / Многопоточное программирование на Java
24Georgiy Korneev Неизменяемые Не изменяются с момента создания Все поля final Ссылаются только на неизменяемые объекты Потокобезопасны Синхронизация не требуется Immutable Java Advanced / Многопоточное программирование на Java
25Georgiy Korneev Эффективно неизменяемые Не изменяются с определенного момента Вся инициализация в одном потоке Ссылаются только на (эффективно) неизменяемые объекты Потокобезопасны Корректно опубликованы Effective immutable Java Advanced / Многопоточное программирование на Java
26Georgiy Korneev Корректная публикация Корректное получение ссылки на объект Полностью инициализирован Опубликован с барьером Получен с барьером Ссылки до окончания конструктора Переопределяемые методы Регистрация слушателей Java Advanced / Многопоточное программирование на Java
27Georgiy Korneev Потокобезопасные Внутренняя синхронизация Для одиночных операций синхронизация не требуется Внешняя синхронизация при массовых операциях Thread-safe Java Advanced / Многопоточное программирование на Java
28Georgiy Korneev Условно потокобезопасные Внешняя синхронизация Синхронизация требуется для всех операций Ответственность на вызывающем Conditionally thread-safe Java Advanced / Многопоточное программирование на Java
29Georgiy Korneev Потоконебезопасные Не могут использоваться в многопоточной среде Патологический случай Надо избегать Thread-hostile Java Advanced / Многопоточное программирование на Java
30Georgiy Korneev Делегирование Одно поле Ссылка не изменяется Потокобезопасный объект Атомарные или независимые операции Можно делегировать всю синхронизацию Java Advanced / Многопоточное программирование на Java
31Georgiy Korneev Привязка к потоку Один поток – один экземпляр Thead-local objects Проблемы с взаимодействием Java Advanced / Многопоточное программирование на Java
32Georgiy Korneev Thread-local objects Существует по одному на каждый поток Каждый может использовать безопасно Доступ Идентификатор Чтение локального объекта Запись локального объекта Java Advanced / Многопоточное программирование на Java
33Georgiy Korneev Класс ThreadLocal Конструкторы TheadLocal() – новый идентификатор Методы get() – чтение set(value) – запись remove() – удаление Наследование initialValue() – исходное значение Java Advanced / Многопоточное программирование на Java
Дополнительные возможности Часть 4 Java Advanced / Многопоточное программирование на Java
35Georgiy KorneevJava Advanced / Многопоточное программирование на Java Интервалы времени Перечисление TimeUnit SECONDS MILLISECONDS MICROSECONDS NANOSECONDS Интервалы задаются парой Значение Единица измерения
36Georgiy KorneevJava Advanced / Многопоточное программирование на Java Очереди с задержкой Класс DelayQueue Интерфейс Delayed getDelay(unit) – получить остаток задержки
37Georgiy Korneev Асинхронное вычисление Класс FutureTask Методы run() – посчитать get(timeout?) – получить результат isDone() – проверить завершение cancel() – отменить isCancelled() – проверить, что отменилось Java Advanced / Многопоточное программирование на Java
38Georgiy Korneev Очереди заданий Интерфейс CompletionService Методы submit(Callable) / submit(Runnable, result) – создать задание poll(timeout?) / take() – получить результат задания Реализация ExecutorCompletionService Java Advanced / Многопоточное программирование на Java
Заключение Часть 7 Java Advanced / Многопоточное программирование на Java
40Georgiy KorneevJava Advanced / Многопоточное программирование на Java Ссылки JSR 166: Concurrency Utilities // Concurrent Programming with J2SE 5.0 // s/J2SE/concurrency/ s/J2SE/concurrency/ Getting to know synchronizers 005/tt0216.html# /tt0216.html#1
41Georgiy KorneevJava Advanced / Многопоточное программирование на Java Вопросы