1 / 41

Многопоточное программирование на Java

Java Advanced. Многопоточное программирование на Java. http://kgeorgiy.info/courses/java-advanced/. Содержание. Многопоточные коллекции Управление заданиями Уровни безопасности Дополнительные возможности. Concurrency Utilities. Набор классов, облегчающих написание многопоточных программ

mliss
Download Presentation

Многопоточное программирование на Java

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Java Advanced Многопоточное программирование на Java http://kgeorgiy.info/courses/java-advanced/

  2. Содержание • Многопоточные коллекции • Управление заданиями • Уровни безопасности • Дополнительные возможности Java Advanced / Многопоточное программирование на Java

  3. Concurrency Utilities • Набор классов, облегчающих написание многопоточных программ • Пакет java.util.concurrent.locks • Работа с блокировками • Пакет java.util.concurrent.atomic • Атомарные переменные • Пакет java.util.concurrent • Примитивы синхронизации • Многопоточные коллекции • Управление заданиями Java Advanced / Многопоточное программирование на Java

  4. Часть 1 Многопоточные коллекции Java Advanced / Многопоточное программирование на Java

  5. Многопоточные очереди • Интерфейсы • BlockingQueue • BlockingDeque • Семантика чтения-записи • Возможно ограничение размера Java Advanced / Многопоточное программирование на Java

  6. Свойства • Массовые операции • remainingCapacity() – свободное место • drainTo(Collection) – получение всех элементов • drainTo(Collection, max) – получение max элементов • Особенности • Неэффективность произвольного доступа • Неатомарность массовых операций Java Advanced / Многопоточное программирование на Java

  7. Производитель-потребитель (1) • Производитель void run() { try { while (true) { E e; // Создание элемента queue.put(e); } } catch (InterruptedException e) { } } Java Advanced / Многопоточное программирование на Java

  8. Производитель-потребитель (2) • Потребитель void run() { try { while (true) { E e = queue.take(); // Обработка элемента } } catch (InterruptedException e) { } } Java Advanced / Многопоточное программирование на Java

  9. Реализации BlockingQueue • ArrayBlockingQueue – очередь на массиве • LinkedBlockingQueue/Deque – очереди на списках • PriorityBlockingQueue – очередь на хипе • SynchronousQueue – очередь без «внутренности» Java Advanced / Многопоточное программирование на Java

  10. Многопоточные отображения (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

  11. Многопоточные отображения (2) • Класс ConcurrentHashMap • Неблокирующее чтение • Частично блокирующая запись • Lock striping Java Advanced / Многопоточное программирование на Java

  12. Другие многопоточные коллекции • Коллекции с многопоточным доступом • ConcurrentLinkedQueue – очередь на списке • ConcurrentSkipListSet/Map – упорядоченное множество/отображение • Коллекции, «самокопирующиеся» призаписи • CopyOnWriteArrayList – список на массиве • CopyOnWriteArraySet – множество на массиве Java Advanced / Многопоточное программирование на Java

  13. Часть 2 Управление заданиями Java Advanced / Многопоточное программирование на Java

  14. Исполнители (1) • Интерфейс Executor • execute(Runnable) – выполнить задание • Возможные варианты выполнения • В том же потоке • Во вновь создаваемом потоке • Пул потоков • Наращиваемый пул потоков Java Advanced / Многопоточное программирование на Java

  15. Функции и результаты • Интерфейс Callable<V> – функция • V call() – подсчитать функцию • Интерфейс Future<V> – результат • get(timeout?) – получить результат • isDone() – окончено ли выполнение • cancel(mayInterruptWhenRunning) – прервать выполнение • isCancelled() – прервано ли выполнение Java Advanced / Многопоточное программирование на Java

  16. Исполнители (2) • Интерфейс ExecutorService • submit(Runnable) – выполнить задание • Future<V> submit(Callable<V>) – выполнить функцию • List<Future> invokeAll(List<Callable>) – выполнить все функции • Future invokeAny(List<Callable>) – успешно выполнить функцию Java Advanced / Многопоточное программирование на Java

  17. Завершение работы • shutdown() – прекратить прием заданий • List<Runnable> shutdownNow() – прекратить выполнение • isShutdown() – прекращен ли прием • isTerminated() – окончен ли все задания • awaitTermination(timeout) – ожидание завершения Java Advanced / Многопоточное программирование на Java

  18. Реализация исполнителей • Класс ThreadPoolExecutor • corePoolSize – минимальное количество потоков • maxPoolSize максимальное количество потоков • blockingQueue – очередь заданий • keepAliveTime – время жизни потока • threadFactory – фабрика потоков • … Java Advanced / Многопоточное программирование на Java

  19. Отклонение заданий • Нет свободного потока и места в очереди • Политики отклонения • AbortPolicy – бросить RejectedExecutionException • CallerRunsPolicy – исполнить в вызывающем потоке • DiscardPolicy – проигноировать • DiscardOldestPolicy – заменить самое давнее • Интерфейс RejectedExecutionHandler Java Advanced / Многопоточное программирование на Java

  20. Отложенное исполнение • Интерфейс ScheduledExecutorService • schedule(callable, timeout) – исполнить через timeout • schedule(runnable, timeout?) – исполнить через timeout • sheduleAtFixedRate(runnable, initialDelay, period) – периодическое исполнение • scheduleWithFixedDelay(runnable, initialDelay, delay)– исполнение с равными интервалами • Все методы возвращают ScheduledFuture Java Advanced / Многопоточное программирование на Java

  21. Реализация отложенного исполнения • Класс ScheduledThreadPoolExecutor Java Advanced / Многопоточное программирование на Java

  22. Класс Executors • Создание исполнителей • newCachedThreadPool() • newFixedThreadPool(n) • newSingleThreadExecutor() • Создание фабрик потоков • Класс ThreadFactory • Создание привилегированных действий и фабрик потоков • Наследую права создавшего Java Advanced / Многопоточное программирование на Java

  23. Часть 3 Уровни безопасности Java Advanced / Многопоточное программирование на Java

  24. Неизменяемые • Не изменяются с момента создания • Все поля final • Ссылаются только на неизменяемые объекты • Потокобезопасны • Синхронизация не требуется • Immutable Java Advanced / Многопоточное программирование на Java

  25. Эффективно неизменяемые • Не изменяются с определенного момента • Вся инициализация в одном потоке • Ссылаются только на (эффективно) неизменяемые объекты • Потокобезопасны • Корректно опубликованы • Effective immutable Java Advanced / Многопоточное программирование на Java

  26. Корректная публикация • Корректное получение ссылки на объект • Полностью инициализирован • Опубликован с барьером • Получен с барьером • Ссылки до окончания конструктора • Переопределяемые методы • Регистрация слушателей Java Advanced / Многопоточное программирование на Java

  27. Потокобезопасные • Внутренняя синхронизация • Для одиночных операций синхронизация не требуется • Внешняя синхронизация при массовых операциях • Thread-safe Java Advanced / Многопоточное программирование на Java

  28. Условно потокобезопасные • Внешняя синхронизация • Синхронизация требуется для всех операций • Ответственность на вызывающем • Conditionally thread-safe Java Advanced / Многопоточное программирование на Java

  29. Потоконебезопасные • Не могут использоваться в многопоточной среде • Патологический случай • Надо избегать • Thread-hostile Java Advanced / Многопоточное программирование на Java

  30. Делегирование • Одно поле • Ссылка не изменяется • Потокобезопасный объект • Атомарные или независимые операции • Можно делегировать всю синхронизацию Java Advanced / Многопоточное программирование на Java

  31. Привязка к потоку • Один поток – один экземпляр • Thead-local objects • Проблемы с взаимодействием Java Advanced / Многопоточное программирование на Java

  32. Thread-local objects • Существует по одному на каждый поток • Каждый может использовать безопасно • Доступ • Идентификатор • Чтение локального объекта • Запись локального объекта Java Advanced / Многопоточное программирование на Java

  33. Класс ThreadLocal • Конструкторы • TheadLocal() – новый идентификатор • Методы • get() – чтение • set(value) – запись • remove() – удаление • Наследование • initialValue() – исходное значение Java Advanced / Многопоточное программирование на Java

  34. Часть 4 Дополнительные возможности Java Advanced / Многопоточное программирование на Java

  35. Интервалы времени • Перечисление TimeUnit • SECONDS • MILLISECONDS • MICROSECONDS • NANOSECONDS • Интервалы задаются парой • Значение • Единица измерения Java Advanced / Многопоточное программирование на Java

  36. Очереди с задержкой • Класс DelayQueue • Интерфейс Delayed • getDelay(unit) – получить остаток задержки Java Advanced / Многопоточное программирование на Java

  37. Асинхронное вычисление • Класс FutureTask • Методы • run() – посчитать • get(timeout?) – получить результат • isDone()– проверить завершение • cancel() – отменить • isCancelled() – проверить, что отменилось Java Advanced / Многопоточное программирование на Java

  38. Очереди заданий • Интерфейс CompletionService • Методы • submit(Callable)/submit(Runnable, result)– создать задание • poll(timeout?)/ take() – получить результат задания • Реализация • ExecutorCompletionService Java Advanced / Многопоточное программирование на Java

  39. Часть 7 Заключение Java Advanced / Многопоточное программирование на Java

  40. Ссылки • 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

  41. Вопросы Java Advanced / Многопоточное программирование на Java

More Related