Скачать презентацию
Идет загрузка презентации. Пожалуйста, подождите
Презентация была опубликована 9 лет назад пользователемOxana Dudnik
1 Параллелизм и потоки в Java For students of university Author: Oxana Dudnik
5 Создание потока Существует два способа: реализацией интерфейса Runnable; реализацией интерфейса Runnable; class MyClass implements Runnable { public void run() { public void run() { // тело метода run }} наследованием класса Thread. наследованием класса Thread. class MyClass extends Thread { public void run() { // тело метода run() // тело метода run()}}
6 Запуск потока Пришло время запустить поток. Это настолько просто, что вряд ли заслуживает отдельного раздела: t.start(); Что происходит после старта потока? А происходит следующее: Стартует новый поток выполнения (с новым стеком вызовов). Поток переходит из состояния new (новый) в состояние работоспособный (runnable). Когда поток получает шанс выполниться, он вызывает метод run().
7 Планировщик потоков Планировщик потоков является частью JVM (хотя некоторые JVM память Java- потоки на нативные потоки ОС) и решает какой поток будет работать в определенный момент. Любой поток, имеющий состояние runnable (работоспособный), может быть выбран планировщиком для выполнения.
8 Состояния потоков
9 Управление выполнением потоков sleep(long millis); - задает задержку в миллисекундах; sleep(long millis, int nanos) – задает задержку в миллисекундах и наносекундах. Приостановка потока, с передачей управления другому потоку производится статическим методом yield(). Прервать работу выполняемого потока можно с помощью метода interrupt(). Чтобы определить состояние потока используется метод isAlive(). Иногда, для выполнения потока необходимо дождаться завершения другого потока. В этих случаях вам поможет метод join().
10 start(). Запускает поток на выполнение. stop(). Заканчивает выполнение потока. sleep(long msec). Останавливает выполнение потока на указанное количество миллисекунд. yield(). Передает ресурсов процессора другому потоку. suspend(). Приостанавливает выполнение потока. resume(). Возобновляет выполнение потока.
11 Synchronized
12 Synchronized object Object sync = new Object();... synchronized(sync){ }
13 Synchronized method public synchronized void someMethod(){ // code }... полностью эквивалентно следующей конструкции: public void someMethod(){ synchronized(this){ // code } }
14 Synchronized class public class SomeClass{ public static synchronized void someMethod(){ //code } }. эквивалентно: public class SomeClass{ public static void someMethod(){ synchronized(SomeClass.class){ //code } } }
15 Взаимные блокировки, deadlocks Что такое взаимная блокировка по своей сути? Все достаточно просто. Предположим, что один поток уже захватил монитор на некотором объекте x и для продолжения работы ему нужно захватить монитор на объекте y. В другом же потоке ситуация ровно обратная – он уже захватил монитор на объекте y и ему нужен монитор объекта x. В результате оба потока будут ждать, пока нужный монитор освободится. Как вы сами прекрасно понимаете, ждать они будут до бесконечности. Эта ситуация и называется взаимной блокировкой – deadlock.
18 Starvation Название starvation полностью соответствует проблеме. Когда множество потоков постоянно находятся в борьбе за один критический ресурс, то все ждут, пока кто-то один освободит этот ресурс. Потом из ждущих по какому-либо алгоритму выбирается только кто- то один, кто следующим захватит ресурс. Таким образом, может найтись один такой поток, который никогда не получит доступ к ресурсу, потому что другие потоки постоянно захватывают ресурс раньше него.
19 livelock livelock частая проблема в асинхронных системах. Там потоки почти не блокируются на критических ресурсах. Вместо этого они выполняют свою небольшую неблокируемую задачу и отправляют её в очередь на обработку другими потоками. Может возникнуть ситуация, когда потоки друг другу начинают перекидывать какое-то событие и его обработка зацикливается. Явного бесконечного цикла, как бы, не происходит, но нагрузка на асинхронную систему резко возрастает. В результате чего эти потоки больше ничем не успевают занимаются.
22 Modificator volatile определение переменной с ключевым словом volatile(«изменчивый») означает, что значение переменной будет изменяться разными потоками. чтение volatile переменных синхронизировано и запись в volatile переменные синхронизирована, а неатомарные операции – нет. Что означает, что следующий код не безопасен для потоков: myVolatileVar++;
23 Non-volitile variable
24 Volitile variable
25 В чем разница между volatile и synchronized? synchronized имеет два важных момента: это гарантия того, что только один поток выполняет секцию кода в один момент времени (взаимоисключение или mutex), и также гарантия того, что данные, изменённые одним потоком, будут видны всем другим потокам (видимость изменений). volatile проще, нежели синхронизация и подходит только для контроля доступа к одиночному экземпляру или переменной примитивного типа: int, boolean... Когда переменная объявлена как volatile, любая запись её будет осуществляться прямо в память, минуя кеш. Также как и считываться будет прямо из памяти, а не из всевозможного кеша. Это значит, что все потоки будут "видеть" одно и то же значение переменной одновременно.
26 Literature As6ZJD0 As6ZJD0 XkiXDfA XkiXDfA MPMfS4 MPMfS4 va-1. html va-1. html ion.html#management ion.html#management
Еще похожие презентации в нашем архиве:
© 2024 MyShared Inc.
All rights reserved.