Your SlideShare is downloading. ×
2013 11 18_java_lecture_10
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Introducing the official SlideShare app

Stunning, full-screen experience for iPhone and Android

Text the download link to your phone

Standard text messaging rates apply

2013 11 18_java_lecture_10

794
views

Published on


0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
794
On Slideshare
0
From Embeds
0
Number of Embeds
4
Actions
Shares
0
Downloads
5
Comments
0
Likes
1
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

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