1 / 45

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

Многопоточное программирование. На примере java. Параллельное исполнение. Однозадачная система. Исполняется только одна задача Все ждут завершения задачи Память отдана исполняемой задачи Ввод-вывод отдан исполняемой задачи Проблемы Простой ресурсов Длительное время отклика.

ronda
Download Presentation

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

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

  2. Параллельное исполнение

  3. Однозадачная система • Исполняется только одна задача • Все ждут завершения задачи • Память отдана исполняемой задачи • Ввод-вывод отдан исполняемой задачи • Проблемы • Простой ресурсов • Длительное время отклика

  4. Системы с пакетным исполнением (кооперативная многозадачность) • Набор заданий для исполнения (пакет) • Память – разделяемая, изолированная • Ввод-вывод – переключение задач • Управление заданиями – монитор • Псевдопараллельное исполнение • Увеличение загрузки ресурсов • Большое время отклика • 1950-е годы

  5. Многозадачные системы (вытесняющая многозадачность) • Несколько задач конкурируют за процессор • Память – разделяемая, изолированная • Прерывание – переключение задач • Ввод-вывод – разделяемый • Параллельное исполнение • Уменьшение времени отклика • 1960-е годы

  6. Многопоточные программы • Несколько задач конкурируют за процессор • Память – общая • Прерывание – переключение потоков • Ввод-вывод – разделяемый • Параллельное исполнение кода внутри программы • Уменьшение времени отклика • 1990-е годы

  7. Многопоточное программирование • Программа одновременно имеет несколько потоков исполнения • Потоки могут создаваться и завершаться во время работы программы • Для организации корректной работы потоки должна взаимодействовать друг с другом (синхронизироваться)

  8. Выделение интерфейса в отдельный поток

  9. Выделение интерфейса в отдельный поток Поток интерфейса Поток логики

  10. Преимущество многопоточной модели • Больше можно не наращивать производительность процессора • Взамен можно наращивать количество ядер

  11. Потоки в java

  12. Создание потоков • Класс Thread– поток • Позволяет создавать потоки и производить операции с ними • Интерфейс Runnable – сущность, которая может быть запущена • public void run();

  13. Создание потока (Runnable) // Созданиепотока Thread t = new Thread(new Runnable() { public void run() { System.out.println("Hello"); } }); // Запускпотока t.start();

  14. Создание потока (Thread) // Созданиепотока Thread t = new Thread() { public void run() { System.out.println("Hello"); } }; // Запускпотока t.start();

  15. Thread замесание • Весь код программы всегда выполняется внутри потока • Чтобы получить ссылку на текущий поток внутри исполняемого кода можно использоватьThread.currentThread() • Можно влиять на поведение потока используя ссылку на этот потокThread.currentThread().sleep(10)

  16. Состояния потока • Состояние потока возвращается методами • intgetState() • booleanisAlive()

  17. Свойства потока • Основные свойства • id – идентификатор потока • name – имя потока • priority – приоритет • daemon – поток-демон • Свойства потока не могут изменяться после запуска (только в состоянии NEW)

  18. Что можно сделать с экземпляром Thread • Создание потока (конструктор) • Запуск потока (start) • Ожидание окончания потока (join) • Прерывание потока (interrupt)

  19. Ожидание окончания потока • Методы класса Thread • join() – ожидать до завершения • join(long millis) – ожидать до завершения или истечения millis миллисекунд • join(long millis, long nanos) – ожидать до завершения или истечения millis миллисекунди nanosнаносекунд • Все методы ожидания кидают InterruptedExcepton

  20. Прерывание потока • Методы класса Thread • interrupt() – установить флаг прерывания • isInterrupted() – проверить флаг прерывания • interrupted() – проверить и сбросить флаг прерывания • Методы, которые ожидают в процессе выполнения должны бросать InterruptedException

  21. Обработка данных в цикле class Worker implements Runnable { publicvoid run() { try { while (!Thread.interrupted()) { // Полезныедействия } } catch (InterruptedException e) { } // Исполнениепотокапрервано // Потокзаканчиваетработу } }

  22. Дополнительные методы • Приостановка выполнения • sleep(time) – приостановить поток на время • yield() – позволить выполниться другим потокам • Получение текущего потока • currentThread()

  23. Блокировки (синхронизация)

  24. Блокировка (lock, mutex) • На любом объекте можно блокироваться • Только один поток может владеть блокировкой в один момент времени • Операции • lock получить блокировку • unlockотдать блокировку

  25. Блокировки в Java • Снятие блокировки производится автоматически • Синтаксис synchronized (o) { // Получение блокировки … }// Снятие блокировки • Один поток может получить блокировку сколько угодно раз (deadlock сам с собой невозможен)

  26. Методы экземпляра • Метод экземпляра может быть объявлен синхронизованным public synchronized intgetValue() { … } • Эквивалентно public intgetValue() { synchronized (this) { … } }

  27. Методы класса • Метод класса может быть объявлен синхронизованным Class Example { public static synchronized intgetValue() { … } • Эквивалентно public intgetValue() { synchronized (Example.class) { … } }

  28. Производитель-потребитель • Один поток производит данные, второй их потребляет • Несколько потоков производят данные и несколько их потребляют • Данные могут храниться в очереди (не)ограниченного объема

  29. Очередь • Хранит один элемент class Queue { private Object data; public void set(Object data) { … } public Object get() { … } } • Очередь может хранить только один элемент • Задача написатьпотокобезопасноget и set

  30. Производитель • Установка значения public void set(Object data) { while (true) {// Активное ожидание synchronized (this) { if (data == null) { this.data = data; break; } } } } Ужасная реализация

  31. Потребитель • Получение значения public Object get() { while (true) {// Активное ожидание synchronized (this) { if (data != null) { Object d = data; data = null; return d; } } } } Ужасная реализация

  32. Мониторы и условия

  33. Монитор • Любой объект может быть монитором • Передача событий • wait(time?)– ожидание условия • notify() – извещение одного из ждущих потоков • notifyAll() – извещение всех ждущих потоков • Нужно владеть блокировкой • IllegalMonitorStateException

  34. Мониторы и блокировки • При ожидании монитора блокировка с него снимается • При извещении поток не получает управления пока не может получить блокировку обратно • Псевдокод monitor.unlock() monitor.await() monitor.lock()

  35. Производитель (способ 2) • Установка значения public synchronized void set(Object data) throws InterruptedException { while (data != null) { wait();// Пассивное ожидание } this.data = data; notify(); }

  36. Потребитель (способ 2) • Получение значения public synchronized Object get() throws InterruptedException { while (data == null) { wait(); // Пассивное ожидание } Object d = data; data = null; notify(); return d; }

  37. notify() и notifyAll() • События одного вида • Может обработать любой ждущий поток • notify() • Несколько видов событий • Побуждение «Не того» потока • notifyAll() • Более дорогая операция

  38. Внезапные пробуждения • wait()может завершиться без notify() • Проверить наступление события • Ожидать всегда в цикле • Идиома • while (дождался)wait();

  39. Java servlet concurrency Многопоточность в WEb

  40. Откуда многопоточность? • Обслуживает нескольких (или даже очень многих) пользователей • Приходится обрабатывать большое количество запросов в одно время • Обслуживание запросов должно происходить в одно время • Надо всегда иметь в веду, что Servlet работает в конкурентной (многопоточной) среде

  41. Что делать чтобы Servlet был потокобезопасен (thread-safe)? Можно просто не нарушать правила • service() метод не должен обращаться к полям servlt’а, если только эти поля не потокобезопасны • Не пересоздавайте поля Srevlet’а внутри метода service(). Если это точно необходимо сделать, то делайте это внутри блока synchronize • Правило 1 и 2 также справедливы для статических переменных класса • Локальные переменные всегда потокобезопасны. Однако если вы локально создали ссылку на разделяемый объект (который видно из других потоков) то объект не станет от этого потокобезопасным

  42. Request && Responce • Объекты Response и Request всегда потокобезопасны. Новые экземпляры этих классов создаются при каждом HTTP запросе к Servlet’у и в каждом потоке они отдельные • Объект сессии (request.getSession()) доступен из нескольких потоков, однако он специально сделан потокобезопасным

  43. Диаграмма работы

  44. Пример кода publicclassSimpleHttpServletextendsHttpServlet{ // Not thread safe, static. protectedstaticListlist=newArrayList(); // Not thread safe protectedMapmap=newHashMap(); // Thread safe to access object, not thread safe to reassign variable. protectedMapmap=newConcurrentHashMap(); // Thread safe to access object (immutable), not thread safe to reassign variable. protectedStringaString="a string value"; protectedvoiddoGet(HttpServletRequest request, HttpServletResponse response)throwsServletException, IOException{ // Not thread safe, unless the singleton is 100% thread safe. SomeClass.getSomeStaticSingleton(); // Thread safe, locally instantiated, and never escapes method.Setset=newHashSet(); } }

  45. Источники • http://tutorials.jenkov.com/java-concurrency/index.html (JakobJenkov) • http://www.lektorium.tv/lecture/?id=13453 (Георгий Корнеев) • http://tutorials.jenkov.com/java-servlets/servlet-concurrency.html (JakobJenkov)

More Related