2013 11 18_java_lecture_10
Upcoming SlideShare
Loading in...5
×
 

Like this? Share it with your network

Share

2013 11 18_java_lecture_10

on

  • 904 views

 

Statistics

Views

Total Views
904
Views on SlideShare
202
Embed Views
702

Actions

Likes
1
Downloads
5
Comments
0

2 Embeds 702

http://beta.compscicenter.ru 663
http://compscicenter.ru 39

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

2013 11 18_java_lecture_10 Presentation Transcript

  • 1. Разработка многопоточных приложений на Java Алексей Владыкин 18 ноября 2013 Алексей Владыкин Многопоточность в Java 18 ноября 2013 1 / 24
  • 2. 1 Общие сведения о параллелизме 2 Управление потоками 3 Синхронизация потоков 4 Модель памяти Алексей Владыкин Многопоточность в Java 18 ноября 2013 2 / 24
  • 3. Общие сведения о параллелизме Алексей Владыкин Многопоточность в Java 18 ноября 2013 3 / 24
  • 4. Общие сведения о параллелизме Мотивация Одновременное выполнение нескольких действий (например, отрисовка пользовательского интерфейса и передача файлов по сети) Ускорение вычислений (при наличии нескольких вычислительных ядер) Алексей Владыкин Многопоточность в Java 18 ноября 2013 4 / 24
  • 5. Общие сведения о параллелизме Закон Амдала S(N) = 1 (1 − P) + P N S — ускорение (speedup) P — доля вычислений, которые возможно распараллелить N — количество вычислительных ядер Алексей Владыкин Многопоточность в Java 18 ноября 2013 5 / 24
  • 6. Общие сведения о параллелизме Параллелизм в Java Запуск нескольких JVM на одном или на разных компьютерах Нет общей памяти Взаимодействие через файловую систему или сетевое соединение Алексей Владыкин Многопоточность в Java 18 ноября 2013 6 / 24
  • 7. Общие сведения о параллелизме Параллелизм в Java Запуск нескольких JVM на одном или на разных компьютерах Нет общей памяти Взаимодействие через файловую систему или сетевое соединение Запуск нескольких потоков внутри JVM Есть общая память Обширная поддержка в языке и стандартной библиотеке Алексей Владыкин Многопоточность в Java 18 ноября 2013 6 / 24
  • 8. Общие сведения о параллелизме Проблемы параллельных программ Гонка (race condition) Взаимная блокировка (deadlock) Алексей Владыкин Многопоточность в Java 18 ноября 2013 7 / 24
  • 9. Управление потоками Алексей Владыкин Многопоточность в Java 18 ноября 2013 8 / 24
  • 10. Управление потоками java.lang.Thread Потоки представлены экземплярами класса java.lang.Thread String getName() long getId() boolean isDaemon() StackTraceElement[] getStackTrace() ThreadGroup getThreadGroup() Алексей Владыкин Многопоточность в Java 18 ноября 2013 9 / 24
  • 11. Управление потоками Thread dump Список всех потоков с их состояниями и stack trace’ами Ctrl+Break или Ctrl+ jps -l, затем jstack PID Кнопка в IDE Алексей Владыкин Многопоточность в Java 18 ноября 2013 10 / 24
  • 12. Управление потоками Создание потока: подкласс Thread Thread thread = new Thread () { @Override public void run () { // do some work } } Алексей Владыкин Многопоточность в Java 18 ноября 2013 11 / 24
  • 13. Управление потоками Создание потока: Runnable Runnable runnable = new Runnable () { @Override public void run () { // do some work } }; Thread thread = new Thread ( runnable ); Алексей Владыкин Многопоточность в Java 18 ноября 2013 12 / 24
  • 14. Управление потоками Жизненный цикл потока Создание объекта Thread Запуск thread.start() Работа выполняется метод run(), thread.isAlive() == true Завершение метод run() закончился или бросил исключение Завершенный поток нельзя перезапустить Алексей Владыкин Многопоточность в Java 18 ноября 2013 13 / 24
  • 15. Управление потоками Прерывание потока thread.interrupt() Если поток находится в ожидании (sleep, join, wait), то ожидание прерывается исключением InterruptedException Иначе у потока просто устанавливается флаг interrupted флаг проверяется методами interrupted() и isInterrupted() проверять флаг и завершать поток надо самостоятельно thread.join() Алексей Владыкин Многопоточность в Java 18 ноября 2013 14 / 24
  • 16. Синхронизация потоков Алексей Владыкин Многопоточность в Java 18 ноября 2013 15 / 24
  • 17. Синхронизация потоков Возможности встроенной синхронизации Взаимное исключение (пока один поток что-то делает, другие не могут ему помешать) Ожидание и уведомление (поток ожидает уведомлений от других потоков) Алексей Владыкин Многопоточность в Java 18 ноября 2013 16 / 24
  • 18. Синхронизация потоков Ключевое слово synchronized Синхронизованный метод public synchronized void doSomething () { // ... } Синхронизованный блок внутри метода public void doSomething () { synchronized ( obj ) { // ... } } Алексей Владыкин Многопоточность в Java 18 ноября 2013 17 / 24
  • 19. Синхронизация потоков Ключевое слово synchronized Синхронизация блоков — по монитору указанного объекта Синхронизация методов — по монитору текущего объекта (this) Синхронизация статических методов — по монитору класса Алексей Владыкин Многопоточность в Java 18 ноября 2013 18 / 24
  • 20. Синхронизация потоков Ожидание и уведомления Допустимо только внутри synchronized void wait() void wait(long millis) void wait(long millis, int nanos) void notify() void notifyAll() Алексей Владыкин Многопоточность в Java 18 ноября 2013 19 / 24
  • 21. Модель памяти Алексей Владыкин Многопоточность в Java 18 ноября 2013 20 / 24
  • 22. Модель памяти Атомарность Чтение и запись полей всех типов, кроме long и double, происходит атомарно Если поле объявлено с модификатором volatile, то атомарно читаются и пишутся даже long и double Алексей Владыкин Многопоточность в Java 18 ноября 2013 21 / 24
  • 23. Модель памяти Видимость Изменения значений полей, сделанные одним потоком, могут быть не видны в другом потоке Изменения, сделанные одним потоком, могут быть видны в другом потоке в ином порядке Правила формализованы при помощи отношения happens-before Алексей Владыкин Многопоточность в Java 18 ноября 2013 22 / 24
  • 24. Модель памяти happens-before Запись volatile-поля happens-before чтения этого поля Освобождение монитора happens-before захват того же монитора thread.start() happens-before thread.run() Завершение thread.run() happens-before выход из thread.join() ... Алексей Владыкин Многопоточность в Java 18 ноября 2013 23 / 24
  • 25. Что сегодня узнали Какие бывают виды параллелизма и как они поддерживаются в Java Как в Java запускать и останавливать потоки Какие в Java есть встроенные в язык средства синхронизации потоков Что такое Java Memory Model Алексей Владыкин Многопоточность в Java 18 ноября 2013 24 / 24