Скачать презентацию
Идет загрузка презентации. Пожалуйста, подождите
Презентация была опубликована 10 лет назад пользователемБогдан Нагайцев
1 1 Java 14. Параллельное выполнение
2 2 Терминология При переводе на русский ДВА английских термина имеют одинаковое значение – поток: stream thread Thread имеет еще одно значение - нить
3 3 Поток и процесс Процесс – это задача операционной системы. У него собственное адресное пространство. С ним может быть проассоциировано несколько потоков. Поток – это гораздо более мелкая единица. Все потоки разделяют адресное пространство породившего их процесса и имеют доступ к одним данным.
4 4 Threads Потоки – средство, которое помогает организовать одновременное выполнение нескольких задач, каждую в независимом потоке. Потоки представляют собой классы, каждый из которых запускается и функционирует самостоятельно, автономно(или относительно автономно) от главного потока выполнения программы. Существуют два способа создания и запуска потока: расширение класса Thread реализация интерфейса Runnable. example01 : расширение класса Thread: Talk.java реализация интерфейса Runnable: Walk.java, WalkTalk.java eck01.
5 5 Планировщик и сборщик мусора Часть потокового механизма Java, обеспечивающая переключение процессора между потоками. Если на компьютере установлено несколько процессоров, планировщик потоков автоматически распределяет потоки между разными процессорами. Работа планировщика потоков недетерминирована. Когда метод main() создает объекты-потоки Thread, он не сохраняет на них ссылки. Каждый поток (Thread) самостоятельно «регистрирует» себя, то есть на самом деле ссылка на него где-то существует, и сборщик мусора не вправе удалить его объект.
6 6 Жизненный цикл потока NEW RUNNABLE BLOCKED WAITING TERMINATED TIMED_WAITING wait() sleep(t) wait(t) notify() notifyAll() unlock lock interval expires tread task completed start thread Метод interrupt() успешно завершает поток, если он RUNNABLE. Иначе метод генерирует исключительные ситуации разного типа в зависимости от способа остановки потока. join() - ?
7 7 Состояния потока Поток может находиться в одном из состояний, соответствующих элементам статически вложенного перечисления Thread.State: NEW – поток создан, но еще не запущен; RUNNABLE – поток выполняется; BLOCKED – поток блокирован (ожидает входа в синхронизированный блок/метод); WAITING – поток ждет окончания работы другого потока; TIMED_WAITING – поток некоторое время ждет окончания другого потока; TERMINATED поток завершен. Получить значение состояния потока можно вызовом метода getState().
8 8 deprecated-методы suspend() – ожидание resume() – прекращение ожидания stop() – остановка выполнения запрещены к использованию, так как они не в полной мере потоко-безопасны.
9 9 Управление приоритетами Потоку можно назначить приоритет: метод setPriority(int prior). от 1 (MIN_PRIORITY) до 10 (MAX_PRIORITY) Получить значение приоритета: метод getPriority(). example02: демонстрация приоритетов: PriorityRunner.java PriorThread.java
10 10 Группы потоков Принадлежность к группе определяется на этапе создания потока. ThreadGroup tg = new ThreadGroup("Группа потоков 1"); Thread t0 = new Thread(tg, "поток 0"); Все потоки, объединенные группой, имеют одинаковый приоритет. Метод getThreadGroup() показывает к какой группе относится поток. Приоритет потока в группе = min(приоритет группы, приоритет потока)
11 11 Остановка потока В Java НЕТ средств для принудительной остановки потока. (кроме deprecated метода stop()). В Java принят уведомительный порядок остановки потока: либо при помощи существующих механизмов; либо созданных вручную. Метод interrupt() класса Thread выставляет некоторый флаг. Состояние этого флага можно проверить с помощью метода isInterrupted(). Статический метод interrupted() производит проверку для текущего потока и сбрасывает флаг. Если у потока были вызваны методы sleep() или wait() - ожидание прервется и будет выброшено исключение InterruptedException. Флаг в этом случае не выставляется.
12 12 Приостановка потока Методы класса Thread: унарные sleep(t) – приостановить (задержать) выполнение потока на t миллисекунд. yield() – может сделать некоторую паузу и позволить другим потокам начать выполнение своей задачи. для синхронизации с другими потоками join() блокирует работу потока, в котором он вызван, до тех пор, пока не будет закончено выполнение вызывающего метод потока. wait(t) – помещает поток в состояние ожидания на время t wait() – помещает поток в состояние ожидания пока другой поток не вызовет notify() или notifyAll() для ожидающего объекта
13 13 Совместное использование ресурсов В условиях многозадачности есть сразу несколько потоков, которые стремятся получить доступ к одному и тому же ограниченному ресурсу. Поэтому фактически все многопоточные схемы синхронизируют доступ к разделяемым ресурсам. Доступ к разделяемому ресурсу в один момент времени может получить только один поток. В Java есть встроенная поддержка для предотвращения конфликтов в виде ключевого слова synchronized. Синхронизации не требуют только атомарные процессы по записи/чтению, не превышающие по объему 32 бит.
14 14 Атомарные операции Атомарная операция – это операция, которую не может прервать планировщик потоков Ключевое слово volatile обеспечивает видимость в рамках приложения. Если поле объявлено как volatile, это означает, что сразу же после записи в поле изменение будет отражено во всех последующих операциях чтения. В Java SE5 появились специальные классы для выполнения атомарных операций с переменными. ненадежна и опасна Синхронизация влияет на производительность
15 15 Методы synchronized Синхронизированный метод изолирует объект, после чего объект становится недоступным для других потоков. Изоляция снимается: когда поток полностью выполнит соответствующий метод если есть вызов метода wait() из изолированного метода example04: синхронизация записи информации в файл : MyThread.java Synchro.java SynchroThreads.java
16 16 Блоки synchronized Синхронизировать объект можно при помощи синхронизированного блока кода. В этом случае происходит блокировка объекта, указанного в инструкции synchronized, и он становится недоступным для других синхронизированных методов и блоков. example05: блокировка объекта потоком: TwoThread.java
17 17 Мониторы то, что обеспечивает работу synchronized-методов и synchronized-блоков это средство обеспечения контроля за доступом к ресурсу У монитора может быть максимум один владелец в каждый текущий момент времени. В Java у каждого экземпляра объекта есть монитор. Используется монитор так: любой нестатический synchronized-метод при своем вызове прежде всего пытается захватить монитор того объекта, у которого он вызван (на который он может сослаться как на this). Если это удалось – метод исполняется. Если нет – поток останавливается и ждет, пока монитор будет отпущен.
18 18 Статические методы У статического метода нет ссылки this. При синхронизации статического метода блокируется монитор соответствующего объекта класса Class. Объекты класса Class существуют в единственном экземпляре только в пределах одного ClassLoader-а. Резюме: Если два нестатических метода объявлены как synchronized, то в каждый момент времени из разных потоков на одном объекте может быть вызван только один из них. Поток, который вызывает метод первым, захватит монитор, и второму потоку придется ждать.
19 19 Взаимные блокировки deadlock Предположим, что один поток уже захватил монитор на некотором объекте x и для продолжения работы ему нужно захватить монитор на объекте y. Другой поток уже захватил монитор на объекте y и ему нужен монитор объекта x. В результате оба потока будут ждать, пока нужный монитор освободится. tread1 tread2 resourceX resourceY захватил ждет захватил ждет ru.skipy.juga_ru.tests.threads: DeadLockTest.java
20 20 Приемы синхронизации По уровню, на котором производится синхронизация потоков, ее можно разделить на две области: системная и программная. Системная осуществляется с использованием средств (мониторов и пр.) виртуальной машины. В программной роль объектов, на которых происходит синхронизация, играют Java-объекты.
21 21 Системная синхронизация с использованием wait / notify Берется некий объект. Поток, который ждет выполнения каких-либо условий, вызывает у этого объекта метод wait(), предварительно захватив его монитор. На этом его работа приостанавливается. Другой поток может вызвать на этом же самом объекте метод notify() (предварительно захватив монитор объекта), в результате чего, ждущий на объекте поток "просыпается" и продолжает свое выполнение. В обоих случаях монитор надо захватывать в явном виде, через synchronized-блок, т.к. методы семейства wait/notify не синхронизированы! example06: взаимодействие wait() и notify() ru.skipy.juga_ru.tests.threads: SyncTest.java, MonitorCaptureTest.java, WaitWithTOTest.java
22 22 метод notifyAll () notifyAll() служит для одной цели – «разбудить» ВСЕ ждущие потоки. вызов notify() подействует только на один. notify() «будит» произвольный поток, ждущий на объекте. notifyAll() «будит» ждущие потоки в произвольном порядке. ru.skipy.juga_ru.tests.threads: NotifyAllTest.java
23 23 Методы synchronized + wait() Если вы синхронизируете доступ к данным на уровне методов, и при этом в каком-либо из методов вызываете wait() – в промежутке ожидания другой поток может вызвать синхронизированный метод и изменить данные. Т.е., фактически, данные в начале синхронизированного метода будут одни, а в конце – другие. ru.skipy.juga_ru.tests.threads: ReentranceTest.java
24 24 Вызов метода wait() Рекомендуется вызывать wait() изнутри цикла while if (some condition){ obj.wait() } while (some condition){ obj.wait() } Вариант с while надежнее. Если поток пустили по ошибке – он опять проверит условие и, если надо, будет ждать дальше.
25 25 Системная синхронизация с использованием join Метод join(), вызванный у экземпляра класса Thread, позволяет текущему потоку остановиться до того момента, как поток, связаный с этим экземпляром, закончит работу. Это удобно во многих случаях. Например, запустили мы чтение данных в отдельном потоке и занялись подготовкой инфраструктуры для их обработки. Закончили подготовку – а данные еще не готовы. Вот тогда можно подождать окончания потока, в котором они читаются. example03: задержка потока: JoinRunner.javaYieldRunner.java eck02. Joining.java
26 26 Программная синхронизация шаблоны и библиотеки В версии 1.5 языка добавлены пакеты классов java.util.concurrent.locks, java.util.concurrent.atomic, java.util.concurrent, возможности которых обеспечивают более высокую производительность, масштабируемость, построение потокобезопасных блоков параллельных (concurrent) классов, вызов утилит синхронизации, использование семафоров, ключей и atomic-переменных. Программная синхронизация гораздо более гибкая. Можно реализовать блокирующие очереди, барьеры, замки, семафоры и много другого. Doug Lea (Дуг Ли) Concurrent Programming in Java: Design Principles and Pattern example07: применение семафора: Sort.java : ArraySort.java
27 27 Многопоточность + GUI example07: GraphicThreadsDemo.java GraphicThreadsDemoSync.java
28 28 Потоки-демоны Демоном называется поток, предоставляющий некоторый сервис, работая в фоновом режиме во время выполнения программы, но при этом не является ее неотъемлемой частью. Программа продолжает выполнение то тех пор, пока существуют работающие потоки не-демоны. Метод setDaemon(boolean value) устанавливает режим работы потока. Метод boolean isDaemon() позволяет определить, является ли поток демоном. example09: запуск и выполнение потока-демона: DemoDaemonThread.java
Еще похожие презентации в нашем архиве:
© 2024 MyShared Inc.
All rights reserved.