Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
java1_2013_2014 / java6.pptx
Скачиваний:
114
Добавлен:
16.04.2015
Размер:
130.63 Кб
Скачать

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

Соседние файлы в папке java1_2013_2014