
- •JAVA-ТЕХНОЛОГИЯ
- •Потоки (threads) и многопоточное программирование (multi-threading)
- •История развития методов синхронизации процессов (1/2)
- •История развития методов синхронизации процессов (продолжение)
- •Виды синхронизации процессов
- •Многопоточное программирование в Java
- •Класс Thread: поля (атрибуты)
- •Класс Thread: методы
- •Синхронизация потоков по ресурсам
- •Синхронизация потоков по событиям
- •Завершение и приостановка потоков
- •Переход в “спящее” состояние и “побудка”
- •Дополнительные возможности управления потоками
- •ThreadGroup: структуризация потоков
- •Новые возможности Java multi-threading (Java 1.5, 1.6, 1.7)
- •Состояния потока (Java

JAVA-ТЕХНОЛОГИЯ
Сафонов Владимир Олегович
Профессор кафедры информатики, руководитель лаборатории Java- технологии (http://polyhimnie.math.spbu.ru/jtl)
Email: vosafonov@gmail.com
Лекция 6

Потоки (threads) и многопоточное программирование (multi-threading)
Поток (thread) – параллельно выполняемая ветвь (нить) программы
Поток реализуется посредством облегченного процесса (lightweight process) . Облегченный процесс, в отличие от обычного, исполняется в одном и том же пространстве виртуальной памяти с создавшим его процессом; при создании облегченного процесса создается только новый стек для исполнения его процедур:
lightweight process <-> stack
В 1979 г. в многопроцессорных комплексах (МВК) “Эльбрус” уже были реализованы облегченные процессы и семафоры
Впервые multi-threading было реализовано в UNIX в конце 80-х гг., затем в 90-х гг. – в Windows NT и Windows 9.x
Java – первый из широко известных языков, имеющий поддержку multi-threading на уровне языка и базового API (core API)
Вслед за Java, потоки были реализованы и в .NET / C#
(C)В.О. Сафонов.
2013

История развития методов синхронизации процессов (1/2)
1966: Edsger W. Dijkstra ”Communucating sequential processes”
Семафор – тип данных для синхронизации процессов:
-может находиться в состояниях “открыт” и “закрыт”
-операции:
P(S) – закрыть (и ждать, если уже закрыт) V(S) – открыть (один из ждущих процессов
может выполнить операцию P(S))
- каждая операция над семафором S атомарна
(atomic)
(C) В.О. Сафонов.
2013 - критический участок (доступ к общему
ресурсу) заключается в семафорные скобки :

История развития методов синхронизации процессов (продолжение)
1974: C.A.R.Hoare ”Monitors – an operating systems structuring concept”
Монитор – многовходовый модуль M, состоящий из процедур P1, … PN, доступ к каждой из которых монополен : в любой момент времени не более чем один из параллельных процессов может вызвать процедуру M.P; другой параллельный процесс, вызвавший M.P, блокируется до момента завершения M.P в первом из процессов.
- Доступ к общему ресурсу – вызов M.P; критический
участок – тело процедуры M.P
(C) В.О. Сафонов. 2013

Виды синхронизации процессов
Синхронизация по ресурсам
(синхронизация типа “открыть – закрыть”) :
- параллельные процессы работают с общим ресурсом
-доступ к ресурсу монополен
-синхронизация осуществляется операциями
открыть, закрыть
Синхронизация по событиям
(синхронизация типа
“ждать – пропустить”) :
- параллельные процессы ждут наступления некоторого события (операция ждать)
- один из процессов отвечает за наступление события
(C) В.О.иСафнотифицируетнов. о нем остальные процессы,
2013 разблокируя их (операция пропустить)

Многопоточное программирование в Java
Класс java.lang.Thread
-содержит атрибуты потока и методы управления им;
-поток может быть создан как объект класса- потомка Thread
Интерфейс java.lang.Runnable
-содержит единственный метод: public void run()
-поток может быть создан как объект класса,
|
реализующего интерфейс Runnable |
|
Методы wait(), notify(), notifyAll() класса Object |
|
Оператор synchronized (obj) S; |
|
- семантически эквивалентен монитору |
|
Методы synchronized – семантически эквивалентны |
(C) В.О. Сафонов. |
|
2013 |
мониторам |

Класс Thread: поля (атрибуты)
Приоритет потока. Определяет очередность выполнения.
-Может изменяться от MIN_PRIORITY до MAX_PRIORITY.
-По умолчанию устанавливается равным NORM_PRIORITY.
-В JDK 1.6:
Thread.MIN_PRIORITY = 1
Thread.MAX_PRIORITY = 10
Thread.NORM.PRIORITY = 5
-Узнать приоритет потока: t.getPriority(); например:
Thread.currentThread().getPriority() – приоритет текущего потока
-Установить приоритет потока: t.setPriority(newPriority);
Имя потока: t.getName()
t.setName(“NewName”) – задание имени Имя начального потока – “main”: Thread.currentThread().getName().equals(“main”) == true
(C) В.О. Сафонов. 2013

Класс Thread: методы
Создание потока; при создании поток не запускается public class MyThread extends Thread { ...
public void run()
{ … /* тело потока; вызывается методом start() */ }
}
MyThread t = new MyThread(”green”);
При создании потока возможно также указание группы потоков или объекта, реализующего Runnable (из него берется run() )
:
public class MyRunnable implements Runnable {
public void run() { … /* тело потока */ } } ; // MyRunnable MyThread t = new MyThread(new MyRunnable(), ”yellow”);
Запуск потока:
t.start(); // вызывается метод t.run()
При создании потока копируются все общие переменные, и поток работает с их копиями в своей памяти . Поля, специфицированные как volatile, берутся при каждом обращении из глобального контекста потока
(C)В.О. Сафонов.
2013

Синхронизация потоков по ресурсам
Пусть объект obj (доступный параллельным потокам)
– критический ресурс. Тогда:
-С объектом obj связывается монитор для синхронизации обращений потоков к данному объекту;
-Вызов монитора, связанного с объектом obj: synchronized(obj) S; // S – операция над объектом obj
Обеспечивает монопольность и атомарность операции S над объектом obj;
- Операция S может быть реализована в виде synchronized-метода:
public class C { … public synchronized void S() { … } … }
… obj = new C(); … obj.S(); // вызов операции S в виде
метода
(C) В.О. Сафонов. 2013

Синхронизация потоков по событиям
Ожидание потоком наступления события: public synchronized void doOnEvent() {
try {
while (!eventCondition) { wait();
}
} // блокировка
catch (InterruptedException e) {System.out.println(”Interrupted”); } actionsOnEvent();
}
Нотификация ждущего потока (потоков) о наступлении события public synchronized void notifyOnEvent() {
eventCondition = true;
notifyAll(); // разблокировка всех ждущих потоков
//другой вариант: notify(); ”будит” только один ждущий поток
}
(C) В.О. Сафонов. 2013