Параллелизм и потоки в Java For students of university Author: Oxana Dudnik.

Презентация:



Advertisements
Похожие презентации
Многопоточное программирование на Java Java Advanced.
Advertisements

Многопоточное программирование на Java Java Advanced.
МНОГОПОТОЧНОЕ ПРОГРАММИРОВАНИЕ В JAVA Пакеты java.lang java.util.concurrent.
ПОТОКИ Начальные сведенияПОТОКИ Начальные сведения.
1 Java 14. Параллельное выполнение. 2 Терминология При переводе на русский ДВА английских термина имеют одинаковое значение – поток: stream thread Thread.
Usage java.util.concurrence in Java For students of universities Author: Oxana Dudnik.
Введение в многопоточное программирование Java Advanced
Модель приложений.NET. Среда платформы Win32, в которой выполняется программа, называется ее процессом. Эта среда состоит из: адресного пространства,
1 Классы в Java Ключевое слово class означает: Я говорю тебе, как выглядит новый тип объекта. Класс является базовым элементом объектно-ориентированного.
Многопоточное программирование Синхронизация потоков Лекция 11.
Параллельное программирование с использованием технологии OpenMP Аксёнов Сергей Владимирович к.т.н., доцент каф.ОСУ ТПУ Лекция 3 Томский политехнический.
Высокоуровневые методы информатики и программирования Лекция 10 События.
Модели транзакций Параллельное выполнение транзакций.
Исполнение программы Энциклопедия учителя информатики Газета «Первое сентября»
Многопоточное программирование в OpenMP Киреев Сергей ИВМиМГ.
1 © Luxoft Training 2012 Java: расширенные вопросы Модуль #8.
Наследование Наследование – это отношение является между классами. class Person { string first_name; int birth_year;... } class Student : Person { float.
Основы информатики Классы Заикин Олег Сергеевич zaikin.all24.org
Встроенные Системы Часть 3. Прерывания Кафедра Информатики, мат-мех СПбГУ Copyright © 2004 Victor Vengerov
©Павловская Т.А. (СПбГУ ИТМО) Курс «С#. Программирование на языке высокого уровня» Павловская Т.А.
Транксрипт:

Параллелизм и потоки в Java For students of university Author: Oxana Dudnik

Создание потока Существует два способа: реализацией интерфейса Runnable; реализацией интерфейса Runnable; class MyClass implements Runnable { public void run() { public void run() { // тело метода run }} наследованием класса Thread. наследованием класса Thread. class MyClass extends Thread { public void run() { // тело метода run() // тело метода run()}}

Запуск потока Пришло время запустить поток. Это настолько просто, что вряд ли заслуживает отдельного раздела: t.start(); Что происходит после старта потока? А происходит следующее: Стартует новый поток выполнения (с новым стеком вызовов). Поток переходит из состояния new (новый) в состояние работоспособный (runnable). Когда поток получает шанс выполниться, он вызывает метод run().

Планировщик потоков Планировщик потоков является частью JVM (хотя некоторые JVM память Java- потоки на нативные потоки ОС) и решает какой поток будет работать в определенный момент. Любой поток, имеющий состояние runnable (работоспособный), может быть выбран планировщиком для выполнения.

Состояния потоков

Управление выполнением потоков sleep(long millis); - задает задержку в миллисекундах; sleep(long millis, int nanos) – задает задержку в миллисекундах и наносекундах. Приостановка потока, с передачей управления другому потоку производится статическим методом yield(). Прервать работу выполняемого потока можно с помощью метода interrupt(). Чтобы определить состояние потока используется метод isAlive(). Иногда, для выполнения потока необходимо дождаться завершения другого потока. В этих случаях вам поможет метод join().

start(). Запускает поток на выполнение. stop(). Заканчивает выполнение потока. sleep(long msec). Останавливает выполнение потока на указанное количество миллисекунд. yield(). Передает ресурсов процессора другому потоку. suspend(). Приостанавливает выполнение потока. resume(). Возобновляет выполнение потока.

Synchronized

Synchronized object Object sync = new Object();... synchronized(sync){ }

Synchronized method public synchronized void someMethod(){ // code }... полностью эквивалентно следующей конструкции: public void someMethod(){ synchronized(this){ // code } }

Synchronized class public class SomeClass{ public static synchronized void someMethod(){ //code } }. эквивалентно: public class SomeClass{ public static void someMethod(){ synchronized(SomeClass.class){ //code } } }

Взаимные блокировки, deadlocks Что такое взаимная блокировка по своей сути? Все достаточно просто. Предположим, что один поток уже захватил монитор на некотором объекте x и для продолжения работы ему нужно захватить монитор на объекте y. В другом же потоке ситуация ровно обратная – он уже захватил монитор на объекте y и ему нужен монитор объекта x. В результате оба потока будут ждать, пока нужный монитор освободится. Как вы сами прекрасно понимаете, ждать они будут до бесконечности. Эта ситуация и называется взаимной блокировкой – deadlock.

Starvation Название starvation полностью соответствует проблеме. Когда множество потоков постоянно находятся в борьбе за один критический ресурс, то все ждут, пока кто-то один освободит этот ресурс. Потом из ждущих по какому-либо алгоритму выбирается только кто- то один, кто следующим захватит ресурс. Таким образом, может найтись один такой поток, который никогда не получит доступ к ресурсу, потому что другие потоки постоянно захватывают ресурс раньше него.

livelock livelock частая проблема в асинхронных системах. Там потоки почти не блокируются на критических ресурсах. Вместо этого они выполняют свою небольшую неблокируемую задачу и отправляют её в очередь на обработку другими потоками. Может возникнуть ситуация, когда потоки друг другу начинают перекидывать какое-то событие и его обработка зацикливается. Явного бесконечного цикла, как бы, не происходит, но нагрузка на асинхронную систему резко возрастает. В результате чего эти потоки больше ничем не успевают занимаются.

Modificator volatile определение переменной с ключевым словом volatile(«изменчивый») означает, что значение переменной будет изменяться разными потоками. чтение volatile переменных синхронизировано и запись в volatile переменные синхронизирована, а неатомарные операции – нет. Что означает, что следующий код не безопасен для потоков: myVolatileVar++;

Non-volitile variable

Volitile variable

В чем разница между volatile и synchronized? synchronized имеет два важных момента: это гарантия того, что только один поток выполняет секцию кода в один момент времени (взаимоисключение или mutex), и также гарантия того, что данные, изменённые одним потоком, будут видны всем другим потокам (видимость изменений). volatile проще, нежели синхронизация и подходит только для контроля доступа к одиночному экземпляру или переменной примитивного типа: int, boolean... Когда переменная объявлена как volatile, любая запись её будет осуществляться прямо в память, минуя кеш. Также как и считываться будет прямо из памяти, а не из всевозможного кеша. Это значит, что все потоки будут "видеть" одно и то же значение переменной одновременно.

Literature As6ZJD0 As6ZJD0 XkiXDfA XkiXDfA MPMfS4 MPMfS4 va-1. html va-1. html ion.html#management ion.html#management