Многопоточное программирование: общие принципы и реализация в Java
План лекции
Проблемы однопоточного подхода
Многопоточное программирование
Квантование времени (Time-Slicing)
Особенности многопоточности
Использование класса Thread
Использование интерфейса Runnable
Особенности использования интерфейса Runnable
Управление потоками
Группы потоков (ThreadGroup)
Создание групп потоков
Операции в группе потоков
Приоритеты потоков
Приоритеты потоков
Демон-потоки (Daemons)
Демон-группы потоков
Неконтролируемое совместное использование ресурсов
Блокировки
Блокировки
Синхронизация
Новые виды ошибок
Совместная работа с полями и переменными
Модификатор полей и переменных final
Модификатор полей volatile
Специальные методы класса Object
Особенности использования методов класса Object
Запрещенные действия над потоками
Корректное прерывание потока
А если поток «спит»?
Пример простого семафора
Пример простого семафора
java.util.concurrent
java.util.concurrent
Спасибо за внимание!
Дополнительные источники
846.47K
Категория: ПрограммированиеПрограммирование

Многопоточное программирование. Принципы и реализация в java. (Лекция 11)

1. Многопоточное программирование: общие принципы и реализация в Java

Самарский государственный аэрокосмический университет
имени академика С.П. Королёва
Объектно-ориентированное
программирование
Многопоточное программирование:
общие принципы
и реализация в Java
Занятие 11
© Составление,
А.В. Гаврилов, 2014
Самара
2015

2. План лекции

Многопоточное программирование и его особенности
Потоки и работа с ними
Группы потоков
Приоритеты потоков
Демон-потоки
Блокировки и синхронизация
Новые виды ошибок
Совместная работа с полями и переменными
Методы класса Object
Прерывание потоков
Высокоуровневые средства
А.В. Гаврилов. Объектно-ориентированное программирование
Занятие 11. Многопоточное программирование. Общие принципы и реализация в Java
2

3. Проблемы однопоточного подхода

Монопольный захват
задачей процессорного
времени
Смешение логически
несвязанных фрагментов
кода
Попытка их разделения
приводит к возникновению
в программе новых
систем и усложнению кода
А.В. Гаврилов. Объектно-ориентированное программирование
Занятие 11. Многопоточное программирование. Общие принципы и реализация в Java
3

4. Многопоточное программирование

Последовательно выполняющиеся
инструкции составляют поток
Потоки выполняются условно
независимо
Потоки могут взаимодействовать друг с
другом
Это не так
В многоядерной системе поток
монопольно занимает одно ядро
А.В. Гаврилов. Объектно-ориентированное программирование
Занятие 11. Многопоточное программирование. Общие принципы и реализация в Java
4

5. Квантование времени (Time-Slicing)

Время разделяется на интервалы (кванты времени)
Во время одного кванта обрабатывается один поток
команд
Решение о выборе потока принимается до начала
интервала
Переключения между потоками с высокой частотой
T1
T2
T3
T4
T3
T4
Время
Иллюзия одновременности!
А.В. Гаврилов. Объектно-ориентированное программирование
Занятие 11. Многопоточное программирование. Общие принципы и реализация в Java
5

6. Особенности многопоточности

Простота выделения подзадач
Более гибкое управление выполнением задач
Более медленное выполнение
Выигрыш в скорости выполнения
при разделении задач
по используемым ресурсам
Выигрыш в скорости
выполнения на
многоядерных системах
Недетерминизм при
выполнении
?
А.В. Гаврилов. Объектно-ориентированное программирование
Занятие 11. Многопоточное программирование. Общие принципы и реализация в Java
6

7. Использование класса Thread

Описание класса
public class ИмяКласса extends Thread {
public void run() {
// Действия, выполняемые потоком
}
}
Запуск потока
ИмяКласса t = new ИмяКласса();
t.start(); // именно start(), а не run() !!!
А.В. Гаврилов. Объектно-ориентированное программирование
Занятие 11. Многопоточное программирование. Общие принципы и реализация в Java
7

8. Использование интерфейса Runnable

Описание класса
public class ИмяКласса implements Runnable {
public void run() {
// Действия, выполняемые потоком
}
}
Запуск потока
Runnable r = new ИмяКласса(); // Это ещё не поток
Thread t = new Thread(r); // А вот это уже поток
t.start();
А.В. Гаврилов. Объектно-ориентированное программирование
Занятие 11. Многопоточное программирование. Общие принципы и реализация в Java
8

9. Особенности использования интерфейса Runnable

Возможность создать класс, описывающий тело
потока и наследующий от класса, отличного от
Thread
Объект вашего класса не является объектом
потока
Невозможно использовать напрямую методы
класса Thread
Можно получить ссылку на объект текущего
потока с помощью статического метода
currentThread() класса Thread
А.В. Гаврилов. Объектно-ориентированное программирование
Занятие 11. Многопоточное программирование. Общие принципы и реализация в Java
9

10. Управление потоками

void start()
Запускает выполнение потока
void stop()
Прекращает выполнение потока
void suspend()
Приостанавливает выполнение потока
void resume()
Возобновляет выполнение потока
void join()
Останавливает выполнение текущего потока до завершения потока, у
объекта которого был вызван метод
static void sleep(long millis)
Останавливает выполнение текущего потока как минимум на millis
миллисекунд
static void yield()
Приостанавливает выполнение текущего потока, предоставляет
возможность выполнять другие потоки
А.В. Гаврилов. Объектно-ориентированное программирование
Занятие 11. Многопоточное программирование. Общие принципы и реализация в Java
10

11. Группы потоков (ThreadGroup)

Каждый поток находится в
группе
Группы потоков образуют
дерево, корнем служит
начальная группа
TG1
TG2
T3
T1
TG3
TG4
T4
Поток не имеет доступа к
информации о
родительской группе
Изменение параметров и
состояния группы влияет
на все входящие в нее
потоки
T2
T6
T5
TG1
TG2
А.В. Гаврилов. Объектно-ориентированное программирование
Занятие 11. Многопоточное программирование. Общие принципы и реализация в Java
TG3
TG4
11

12. Создание групп потоков

Создание группы
//Без явного указания родительской группы
ThreadGroup group1 = new ThreadGroup("Group1");
//С явным указанием родительской группы
ThreadGroup group2 = new ThreadGroup(group1, "Group2");
Создание потока
//Без явного указания группы
MyThread t1 = new MyThread("Thread1");
//С явным указанием группы
MyThread t2 = new MyThread(group2, "Thread2");
А.В. Гаврилов. Объектно-ориентированное программирование
Занятие 11. Многопоточное программирование. Общие принципы и реализация в Java
12

13. Операции в группе потоков

int activeCount()
Возвращает оценку количества потоков
int enumerate(Thread[] list)
Копирует в массив активные потоки
int activeGroupCount()
Возвращает оценку количества подгрупп
int enumerate(ThreadGroup[] list)
Копирует в массив активные подгруппы
void interrupt()
Прерывает выполнение всех потоков в группе
А.В. Гаврилов. Объектно-ориентированное программирование
Занятие 11. Многопоточное программирование. Общие принципы и реализация в Java
13

14. Приоритеты потоков

Приоритет – количественный показатель важности
потока
Недетерминированно воздействуют на системную
политику упорядочивания потоков
Базовый алгоритм программы не должен зависеть
от схемы расстановки приоритетов потоков
При задании
значений приоритетов
рекомендуется
использовать константы
А.В. Гаврилов. Объектно-ориентированное программирование
Занятие 11. Многопоточное программирование. Общие принципы и реализация в Java
14

15. Приоритеты потоков

Константы в классе Thread
MAX_PRIORITY
MIN_PRIORITY
NORM_PRIORITY
Методы потока
int getPriority()
void setPriority(int newPriority)
Методы группы потоков
int getMaxPriority()
void setMaxPriority(int priority)
А.В. Гаврилов. Объектно-ориентированное программирование
Занятие 11. Многопоточное программирование. Общие принципы и реализация в Java
15

16. Демон-потоки (Daemons)

Демон-потоки позволяют описывать фоновые
процессы, которые нужны только для обслуживания
основных потоков выполнения и не могут
существовать без них
Уничтожаются виртуальной машиной, если в группе не
осталось не-демон потоков
void setDaemon(boolean on)
Устанавливает вид потока
Вызывается до запуска потока
boolean isDaemon()
Возвращает вид потока:
true – демон, false – обычный
А.В. Гаврилов. Объектно-ориентированное программирование
Занятие 11. Многопоточное программирование. Общие принципы и реализация в Java
16

17. Демон-группы потоков

Демон-группа автоматически уничтожается при
остановке последнего ее потока или
уничтожении последней подгруппы потоков
void setDaemon(boolean on)
Устанавливает вид группы
boolean isDaemon()
Возвращает вид группы:
true – демон, false – обычная
А.В. Гаврилов. Объектно-ориентированное программирование
Занятие 11. Многопоточное программирование. Общие принципы и реализация в Java
17

18. Неконтролируемое совместное использование ресурсов

Недетерминизм программы
Конечный результат работы программы
непредсказуем
Некорректность работы программы
Возможность некорректной работы
алгоритма, возникновения
исключительных ситуаций
А.В. Гаврилов. Объектно-ориентированное программирование
Занятие 11. Многопоточное программирование. Общие принципы и реализация в Java
18

19. Блокировки

Только один поток в один момент времени может
установить блокировку на некоторый объект
Попытка блокировки уже
заблокированного объекта
приводит к останову
потока до момента
разблокирования этого
объекта
Наличие блокировки
не запрещает всех
остальных действий
с объектом
А.В. Гаврилов. Объектно-ориентированное программирование
Занятие 11. Многопоточное программирование. Общие принципы и реализация в Java
19

20. Блокировки

Поток 1
1) Накладывает блок
2) Работает
5) Снимает блок
Объект
Объедк
Поток 2
3)
4)
6)
7)
Пытается наложить блок
Ждет
Накладывает блок
Работает
Поток 3
А.В. Гаврилов. Объектно-ориентированное программирование
Занятие 11. Многопоточное программирование. Общие принципы и реализация в Java
20

21. Синхронизация

Синхронизированный блок
//Блокируется указанный объект
synchronized (ссылкаНаОбъект>) {
// Тело блока синхронизации
}
Синхронизированный метод
//Блокируется объект-владелец метода
public synchronized void метод() {
// Тело метода
}
А.В. Гаврилов. Объектно-ориентированное программирование
Занятие 11. Многопоточное программирование. Общие принципы и реализация в Java
21

22. Новые виды ошибок

Отсутствие синхронизации
Необоснованная длительная блокировка объектов
Взаимная блокировка
(deadlock)
Возникновение
монопольных потоков
Нерациональное
назначение приоритетов
А.В. Гаврилов. Объектно-ориентированное программирование
Занятие 11. Многопоточное программирование. Общие принципы и реализация в Java
22

23. Совместная работа с полями и переменными

Значения переменных изменяются атомарным
образом (кроме double и long)
При совместной работе с полем может
возникнуть неоднозначность
Например,
на объект, на который ссылается
переменная, наложена блокировка, после чего
значение переменной изменяется
Например,
компилятор может оптимизировать
фрагмент кода, предполагая, что поле не изменяет
значение
А.В. Гаврилов. Объектно-ориентированное программирование
Занятие 11. Многопоточное программирование. Общие принципы и реализация в Java
23

24. Модификатор полей и переменных final

После первого присвоения переменная не
может изменять своё значение
Если блокировка накладывается на
объект, ссылка на который хранится в
поле, поле обычно делают неизменяемым
Локальные и анонимные классы могут
обращаться к локальным переменным,
только если они неизменяемы
А.В. Гаврилов. Объектно-ориентированное программирование
Занятие 11. Многопоточное программирование. Общие принципы и реализация в Java
24

25. Модификатор полей volatile

Предупреждает компилятор о том, что
переменная может изменить своё
значение в произвольный момент времени
Обращение к переменной всегда будет
возвращать именно последнее
присвоенное ей значение
Если работа с полем ведётся только в
синхронизированном коде, применение
модификатора неосмысленно
А.В. Гаврилов. Объектно-ориентированное программирование
Занятие 11. Многопоточное программирование. Общие принципы и реализация в Java
25

26. Специальные методы класса Object

Каждый объект имеет набор ожидающих потоков
исполнения (wait-set)
Любой поток может вызвать метод wait()
любого объекта и попасть в его wait-set,
остановившись до пробуждения
Метод объекта notify() пробуждает один,
случайно выбранный поток из wait-set объекта
Метод объекта notifyAll() пробуждает все
потоки из wait-set объекта
А.В. Гаврилов. Объектно-ориентированное программирование
Занятие 11. Многопоточное программирование. Общие принципы и реализация в Java
26

27. Особенности использования методов класса Object

Метод может быть вызван потоком у объекта
только после установления блокировки на этот
объект
Потоки, прежде чем приостановить
выполнение после вызова метода wait(),
снимают все свои блокировки
После вызова
освобождающего метода
потоки пытаются восстановить
ранее снятые блокировки
А.В. Гаврилов. Объектно-ориентированное программирование
Занятие 11. Многопоточное программирование. Общие принципы и реализация в Java
27

28. Запрещенные действия над потоками

Thread.suspend(), Thread.resume()
Увеличивает количество взаимных
блокировок
Thread.stop()
Использование приводит
к возникновению
поврежденных объектов
А.В. Гаврилов. Объектно-ориентированное программирование
Занятие 11. Многопоточное программирование. Общие принципы и реализация в Java
28

29. Корректное прерывание потока

public void interrupt()
Изменяет статус потока на прерванный
public static boolean interrupted()
Возвращает и очищает статус потока (прерван или нет)
public boolean isInterrupted()
Возвращает статус потока (прерван или нет)
Поток должен в ходе своей работы проверять свой
статус и корректно завершать работу, если его
прервали
А.В. Гаврилов. Объектно-ориентированное программирование
Занятие 11. Многопоточное программирование. Общие принципы и реализация в Java
29

30. А если поток «спит»?

В том случае, если в текущий момент
поток выполняет методы wait(),
sleep(), join(), а его прерывают
вызовом метода interrupt()…
метод прерывает свое выполнение с
выбросом исключения
InterruptedException !
Потоку не сообщается, что его прервали!
А.В. Гаврилов. Объектно-ориентированное программирование
Занятие 11. Многопоточное программирование. Общие принципы и реализация в Java
30

31. Пример простого семафора

public class Semaphore {
private boolean canWrite = true;
public synchronized void beginRead()
throws InterruptedException {
while (canWrite) {
wait();
}
}
public synchronized void endRead() {
canWrite = true;
notifyAll();
}
А.В. Гаврилов. Объектно-ориентированное программирование
Занятие 11. Многопоточное программирование. Общие принципы и реализация в Java
31

32. Пример простого семафора

public synchronized void beginWrite()
throws InterruptedException {
while (!canWrite) {
wait();
}
}
public synchronized void endWrite() {
canWrite = false;
notifyAll();
}
}
А.В. Гаврилов. Объектно-ориентированное программирование
Занятие 11. Многопоточное программирование. Общие принципы и реализация в Java
32

33. java.util.concurrent

Пакет содержит высокоуровневый
инструментарий для многопоточных приложений
Пакет содержит следующие категории
инструментов
Executors – средства запуска потоков
Synchronizers – средства синхронизации работы
потоков
Timing – вспомогательные средства контроля времени
Concurrent structures – структуры, корректно
работающие в многопоточных приложениях (без
блокировки всей структуры)
А.В. Гаврилов. Объектно-ориентированное программирование
Занятие 11. Многопоточное программирование. Общие принципы и реализация в Java
33

34. java.util.concurrent

java.util.concurrent.atomic
пакет содержит классы оберток для
базовых типов, обеспечивающие
корректный доступ к значениям в
многопоточных приложениях
java.util.concurrent.locks
пакет содержит высокоуровневые
средства работы с блокировками и
критическими секциями
А.В. Гаврилов. Объектно-ориентированное программирование
Занятие 11. Многопоточное программирование. Общие принципы и реализация в Java
34

35. Спасибо за внимание!

36. Дополнительные источники

Арнолд, К. Язык программирования Java [Текст] / Кен Арнолд, Джеймс Гослинг, Дэвид
Холмс. – М. : Издательский дом «Вильямс», 2001. – 624 с.
Вязовик, Н.А. Программирование на Java. Курс лекций [Текст] / Н.А. Вязовик. – М. :
Интернет-университет информационных технологий, 2003. – 592 с.
Хорстманн, К. Java 2. Библиотека профессионала. Том 2. Тонкости программирования
[Текст] / Кей Хорстманн, Гари Корнелл. – М. : Издательский дом «Вильямс», 2010 г. –
992 с.
Эккель, Б. Философия Java [Текст] / Брюс Эккель. – СПб. : Питер, 2011. – 640 с.
JavaSE at a Glance [Электронный ресурс]. – Режим доступа:
http://www.oracle.com/technetwork/java/javase/overview/index.html, дата доступа:
21.10.2011.
JavaSE APIs & Documentation [Электронный ресурс]. – Режим доступа:
http://www.oracle.com/technetwork/java/javase/documentation/api-jsp-136079.html, дата
доступа: 21.10.2011.
А.В. Гаврилов. Объектно-ориентированное программирование
Занятие 11. Многопоточное программирование. Общие принципы и реализация в Java
English     Русский Правила