2012 11 07_java_lecture09

2,936 views

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
2,936
On SlideShare
0
From Embeds
0
Number of Embeds
2,622
Actions
Shares
0
Downloads
14
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

2012 11 07_java_lecture09

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

×