Разделы презентаций


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

Содержание

План лекцииПотоки инструкций и многопоточное программированиеСоздание потоков и управление имиСовместное использование ресурсов и блокировкиВзаимодействие между потоками

Слайды и текст этой презентации

Слайд 1Многопоточное программирование
© Составление, Будаев Д.С., Гаврилов А.В., 2013
Лекция 7
УНЦ «Инфоком»
Самара
2013

Многопоточное программирование© Составление, Будаев Д.С., Гаврилов А.В., 2013Лекция 7УНЦ «Инфоком»Самара2013

Слайд 2План лекции
Потоки инструкций и многопоточное программирование

Создание потоков и управление ими

Совместное

использование ресурсов и блокировки

Взаимодействие между потоками

План лекцииПотоки инструкций и многопоточное программированиеСоздание потоков и управление имиСовместное использование ресурсов и блокировкиВзаимодействие между потоками

Слайд 3Проблемы однопоточного подхода
Монопольный захват задачей процессорного времени

Смешение логически несвязанных фрагментов

кода

Попытка их разделения приводит к возникновению в программе новых систем

и усложнению кода
Проблемы однопоточного подходаМонопольный захват задачей процессорного времениСмешение логически несвязанных фрагментов кодаПопытка их разделения приводит к возникновению в

Слайд 4Многопоточное программирование
Последовательно выполняющиеся инструкции составляют поток
Потоки выполняются независимо
Потоки могут взаимодействовать друг

с другом
В многоядерной системе поток монопольно занимает одно ядро
Это не

так


условно

Многопоточное программированиеПоследовательно выполняющиеся инструкции составляют потокПотоки выполняются независимоПотоки могут взаимодействовать друг с другомВ многоядерной системе поток монопольно

Слайд 5Многопоточная архитектура
При наличии нескольких процессоров теоретически каждому можно выделить отдельную

задачу
Что же делать, если используется вычислительная система с одним процессором?

Многопоточная архитектураПри наличии нескольких процессоров теоретически каждому можно выделить отдельную задачуЧто же делать, если используется вычислительная система

Слайд 6Квантование времени (Time-Slicing)
Время разделяется на интервалы (кванты времени)
Во время одного кванта

обрабатывается один поток команд
Решение о выборе потока принимается до начала

интервала
Переключения между потоками с высокой частотой




Иллюзия одновременности!

T1

T2

T3

T4

T3

T4

Квантование времени (Time-Slicing)Время разделяется на интервалы (кванты времени)Во время одного кванта обрабатывается один поток командРешение о выборе

Слайд 7Преимущества
Одновременная работа нескольких приложений
Одновременное обслуживание нескольких запросов одним приложением
Одновременное обработка

входящих данных от нескольких устройств
Более гибкое управление выполнением задач, возможность

корректировки задачи
ПреимуществаОдновременная работа нескольких приложенийОдновременное обслуживание нескольких запросов одним приложениемОдновременное обработка входящих данных от нескольких устройствБолее гибкое управление

Слайд 8Особенности многопоточности
Простота выделения подзадач
Более медленное выполнение
Выигрыш в скорости выполнения при разделении

задач по используемым ресурсам
Выигрыш в скорости выполнения на многоядерных системах
Недетерминизм

при выполнении

?

Особенности многопоточностиПростота выделения подзадачБолее медленное выполнениеВыигрыш в скорости выполнения при разделении задач по используемым ресурсамВыигрыш в скорости

Слайд 9Класс Thread
Поток выполнения представляется экземпляром класса Thread
Для создания потока выполнения

можно
создать класс, наследующий Thread
переопределить метод run()
Для запуска потока используется метод

start() у объекта класса-наследника
Класс ThreadПоток выполнения представляется экземпляром класса ThreadДля создания потока выполнения можносоздать класс, наследующий Threadпереопределить метод run()Для запуска

Слайд 10Использование класса Thread
Описание класса




Запуск потока

public class extends Thread

{
public void run() {
// Действия, выполняемые потоком

}
}

<Имя класса> t = new <Имя класса>();
t.start(); //именно start(), а не run() !!!

Использование класса ThreadОписание классаЗапуск потокаpublic class extends Thread { public void run() {  // Действия, выполняемые

Слайд 11Пример работы с Thread
Описание класса

public class MyThread extends Thread {

public void run() {
long sum = 0;

for (int i = 0; i < 1000000; i++) {
sum += i;
}
System.out.println(sum);
}
}

MyThread t = new MyThread();
t.start(); // 499999500000

Запуск потока

Пример работы с ThreadОписание классаpublic class MyThread extends Thread {  public void run() {  long

Слайд 12Интерфейс Runnable
Объявляет один метод – void run()
Объект данного типа не

является потоком
Невозможно использовать напрямую методы класса Thread
Возможность создать класс, описывающий

тело потока и наследующий от класса, отличного от Thread
Можно получить ссылку на объект текущего потока с помощью статического метода currentThread() класса Thread
Интерфейс RunnableОбъявляет один метод – void run()Объект данного типа не является потокомНевозможно использовать напрямую методы класса ThreadВозможность

Слайд 13Использование интерфейса Runnable
Описание класса
public class implements Runnable {

public void run() {
// Действия, выполняемые потоком
}
}
Runnable

r = new <Имя класса>();
Thread t = new Thread(r);
t.start();

Запуск потока

Использование интерфейса RunnableОписание классаpublic class implements Runnable { public void run() {  // Действия, выполняемые потоком

Слайд 14Пример работы с Runnable
public class MyRunnable implements Runnable {

public void run() {
long sum = 0;

for (int i = 0; i < 1000000; i++) {
sum += i;
}
System.out.println(sum);
}
}

Thread t = new Thread(new MyRunnable());
t.start(); // 499999500000

Описание класса

Запуск потока

Пример работы с Runnablepublic class MyRunnable implements Runnable {  public void run() {  long sum

Слайд 15Управление потоками
void start() Запускает выполнение потока
void stop() Прекращает выполнение потока
void suspend() Приостанавливает выполнение

потока
void resume() Возобновляет выполнение потока
void join() Останавливает выполнение текущего потока до завершения

потока, у объекта которого был вызван метод
static void sleep(long millis) Останавливает выполнение текущего потока как минимум на millis миллисекунд
static void yield() Приостанавливает выполнение текущего потока, предоставляет возможность выполнять другие потоки
Управление потокамиvoid start() Запускает выполнение потокаvoid stop() Прекращает выполнение потокаvoid suspend() Приостанавливает выполнение потокаvoid resume() Возобновляет выполнение

Слайд 16Группы потоков (ThreadGroup)
Каждый поток находится в группе
Группы потоков образуют дерево, корнем

служит начальная группа
Поток не имеет доступа к информации о родительской

группе
Изменение параметров и состояния группы влияет на все входящие в нее потоки

T1

T2

T3

T4

T6

T5


TG1


TG2


TG3


TG4



Группы потоков (ThreadGroup)Каждый поток находится в группеГруппы потоков образуют дерево, корнем служит начальная группаПоток не имеет доступа

Слайд 17Создание групп потоков
Создание группы



Создание потока

//Без явного указания родительской группы
ThreadGroup group1

= new ThreadGroup("Group1");
//С явным указанием родительской группы
ThreadGroup group2 = new

ThreadGroup(group1, "Group2");

//Без явного указания группы
MyThread t = new MyThread("Thread1");
//С явным указанием группы
MyThread t = new MyThread(group2, "Thread2");

Создание групп потоковСоздание группыСоздание потока//Без явного указания родительской группыThreadGroup group1 = new ThreadGroup(

Слайд 18Операции в группе потоков
int activeCount() Возвращает оценку количества потоков
int enumerate(Thread[] list) Копирует в

массив активные потоки
int activeGroupCount() Возвращает оценку количества подгрупп
int enumerate(ThreadGroup[] list) Копирует в массив

активные подгруппы
void interrupt() Прерывает выполнение всех потоков в группе
Операции в группе потоковint activeCount() Возвращает оценку количества потоковint enumerate(Thread[] list) Копирует в массив активные потокиint activeGroupCount() Возвращает

Слайд 19Приоритеты потоков
Приоритет – количественный показатель важности потока
Недетерминированно воздействуют на системную

политику упорядочивания потоков
Базовый алгоритм программы не должен зависеть от схемы

расстановки приоритетов потоков
При задании значений приоритетов рекомендуется использовать константы
Приоритеты потоковПриоритет – количественный показатель важности потокаНедетерминированно воздействуют на системную политику упорядочивания потоковБазовый алгоритм программы не должен

Слайд 20Приоритеты потоков
Константы static int MAX_PRIORITY static int MIN_PRIORITY static int NORM_PRIORITY
Методы потока int getPriority() void setPriority(int newPriority)


Методы группы потоков int getMaxPriority() void setMaxPriority(int priority)

Приоритеты потоковКонстанты static int MAX_PRIORITY  static int MIN_PRIORITY static int NORM_PRIORITYМетоды потока int getPriority()  void setPriority(int newPriority) Методы группы

Слайд 21Приоритеты потоков
public class MyThread extends Thread {
public void run()

{
long sum = 0;
for (int i = 0;

i < 1000000; i++) {
if (i % 1000 == 0) {System.out.println(getName() + ": " + i/1000);}
}
}
}

Thread t1 = new MyThread();
t1.setPriority(Thread.MIN_PRIORITY);
t1.start();

Thread t2 = new MyThread();
t2.setPriority(Thread.MAX_PRIORITY);
t2.start();

Приоритеты потоковpublic class MyThread extends Thread { public void run() { long sum = 0; for (int

Слайд 22Приоритеты потоков
Thread-0: 0
Thread-1: 0
Thread-1: 1
Thread-0: 1
Thread-1: 2
Thread-0: 2
Thread-1: 3
Thread-0: 3
Thread-1:

4
Thread-0: 4
Thread-1: 5
Thread-0: 5
Thread-1: 6
Thread-0: 6
Thread-1: 7
Thread-0: 0
Thread-0: 1
Thread-1: 0
Thread-0:

2
Thread-1: 1
Thread-0: 3
Thread-1: 2
Thread-0: 4
Thread-1: 3
Thread-0: 5
Thread-1: 4
Thread-1: 5
Thread-1: 6
Thread-1: 7
Thread-1: 8
Приоритеты потоковThread-0: 0Thread-1: 0Thread-1: 1Thread-0: 1Thread-1: 2Thread-0: 2Thread-1: 3Thread-0: 3Thread-1: 4Thread-0: 4Thread-1: 5Thread-0: 5Thread-1: 6Thread-0: 6Thread-1: 7Thread-0:

Слайд 23Демон-потоки (Daemons)
Демон-потоки позволяют описывать фоновые процессы, которые нужны только для обслуживания

основных потоков выполнения и не могут существовать без них
Уничтожаются виртуальной

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

Слайд 24Демон-группы потоков
Демон-группа автоматически уничтожается при остановке последнего ее потока или

уничтожении последней подгруппы потоков

void setDaemon(boolean on) Устанавливает вид группы

boolean isDaemon() Возвращает вид

группы: true – демон, false – обычная
Демон-группы потоковДемон-группа автоматически уничтожается при остановке последнего ее потока или уничтожении последней подгруппы потоковvoid setDaemon(boolean on) Устанавливает вид

Слайд 25Неконтролируемое совместное использование ресурсов
Недетерминизм программы Конечный результат работы программы непредсказуем

Некорректность работы

программы Возможность некорректной работы алгоритма, возникновения исключительных ситуаций

Неконтролируемое совместное использование ресурсовНедетерминизм программы Конечный результат работы программы непредсказуемНекорректность работы программы Возможность некорректной работы алгоритма, возникновения

Слайд 26Неконтролируемое совместное использование ресурсов
public class Shared {
private int a

= 0, b = 1;
public void one() { a

= b; }
public void two() { b = a; }
...
}

public static void main(String[] args) {
final Shared object = new Shared();
for (int i = 0; i < 1000; i++) {
new Thread() { public void run() { object.one(); } }.start();
new Thread() { public void run() { object.two(); } }.start();
}
...
}

Неконтролируемое совместное использование ресурсовpublic class Shared { private int a = 0, b = 1; public void

Слайд 27Блокировки
Только один поток в один момент времени может установить блокировку

на некоторый объект

Попытка блокировки уже заблокированного объекта приводит к приостановке

потока до момента разблокирования этого объекта

Наличие блокировки не запрещает всех остальных действий с объектом
БлокировкиТолько один поток в один момент времени может установить блокировку на некоторый объектПопытка блокировки уже заблокированного объекта

Слайд 28
Блокировки
Поток 1
Поток 2
Поток 3

Объект
1) Накладывает блок
2) Работает
3) Пытается наложить блок
4)

Ждет
5) Снимает блок
6) Накладывает блок
7) Работает
Объедк

БлокировкиПоток 1Поток 2Поток 3Объект1) Накладывает блок2) Работает3) Пытается наложить блок4) Ждет5) Снимает блок6) Накладывает блок7) РаботаетОбъедк

Слайд 29Синхронизация
Синхронизированный блок



Синхронизированный метод

//Блокируется указанный объект
synchronized () {

синхронизации>
}
//Блокируется объект-владелец метода
public synchronized void () {

}

СинхронизацияСинхронизированный блокСинхронизированный метод//Блокируется указанный объектsynchronized () {	}//Блокируется объект-владелец методаpublic synchronized void () {	}

Слайд 30Характерные ошибки
Отсутствие синхронизации

Необоснованная длительная блокировка объектов

Взаимная блокировка (deadlock)

Возникновение монопольных потоков

Нерациональное

назначение приоритетов

Характерные ошибкиОтсутствие синхронизацииНеобоснованная длительная блокировка объектовВзаимная блокировка (deadlock)Возникновение монопольных потоковНерациональное назначение приоритетов

Слайд 31Специальные методы класса Object
Каждый объект имеет набор ожидающих потоков исполнения (wait-set)
Любой

поток может вызвать метод wait() любого объекта и попасть в

его wait-set, остановившись до пробуждения
Метод объекта notify() пробуждает один, случайно выбранный поток из wait-set объекта
Метод объекта notifyAll() пробуждает все потоки из wait-set объекта
Специальные методы класса ObjectКаждый объект имеет набор ожидающих потоков исполнения (wait-set)Любой поток может вызвать метод wait() любого

Слайд 32Особенности использования методов класса Object
Метод может быть вызван потоком у

объекта только после установления блокировки на этот объект
Потоки, прежде чем

приостановить выполнение после вызова метода wait(), снимают все свои блокировки
После вызова освобождающего метода потоки пытаются восстановить ранее снятые блокировки
Особенности использования методов класса ObjectМетод может быть вызван потоком у объекта только после установления блокировки на этот

Слайд 33Запрещенные действия над потоками
Thread.suspend(), Thread.resume()
Увеличивает количество взаимных блокировок

Thread.stop()
Использование приводит к

возникновению поврежденных объектов

Запрещенные действия  над потокамиThread.suspend(), Thread.resume()	Увеличивает количество взаимных блокировокThread.stop()	Использование приводит к возникновению поврежденных объектов

Слайд 34Прерывание потока
public void interrupt() Изменяет статус потока на прерванный

public static boolean

interrupted() Возвращает и очищает статус потока (прерван или нет)

public boolean isInterrupted() Возвращает

статус потока (прерван или нет)
Поток должен в ходе своей работы проверять свой статус и корректно завершать работу, если его прервали
Прерывание потокаpublic void interrupt() Изменяет статус потока на прерванныйpublic static boolean interrupted() Возвращает и очищает статус потока

Слайд 35А если поток «спит»?
В том случае, если в текущий момент

поток выполняет методы wait(), sleep(), join(), а его прерывают вызовом

метода interrupt()…
метод прерывает свое выполнение с выбросом исключения InterruptedException !
Потоку не сообщается, что его прервали!
А если поток «спит»?В том случае, если в текущий момент поток выполняет методы wait(), sleep(), join(), а

Слайд 36Пример кода объекта-посредника
public class Keeper {
private Object data;

private boolean gettingData = false;

synchronized public void

putData(Object obj) try {
while(gettingData)
wait();
data = obj;
gettingData = true;
notifyAll();
} catch(InterruptedException e) {
Thread.currentThread().interrupt();
}
}
...
Пример кода  объекта-посредникаpublic class Keeper {  private Object data;  private boolean gettingData = false;

Слайд 37Пример кода объекта-посредника
...

synchronized public Object getData()

throws InterruptedException {
while(!gettingData)

wait();
gettingData = false;
notifyAll();
return data;
}
}
Пример кода  объекта-посредника...  synchronized public Object getData()   					throws InterruptedException {

Слайд 38Отличия wait() и sleep()
wait() вызывается потоком у объекта, а sleep()

вызывается для потока
ожидающий поток можно запустить методами notifyAll() или notify(),

а «спящий» поток «разбудить» нельзя
wait() вызывается из синхронизированного контекста, а для sleep() это не обязательно
wait() обычно вызывается при условии, причем поток освобождает блокировку на объект
Отличия wait() и sleep()wait() вызывается потоком у объекта, а sleep() вызывается для потокаожидающий поток можно запустить методами

Слайд 39
Спасибо за внимание!

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

Слайд 40Дополнительные источники
Арнолд, К. Язык программирования 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.
Дополнительные источникиАрнолд, К. Язык программирования Java [Текст] / Кен Арнолд, Джеймс Гослинг, Дэвид Холмс. – М. :

Обратная связь

Если не удалось найти и скачать доклад-презентацию, Вы можете заказать его на нашем сайте. Мы постараемся найти нужный Вам материал и отправим по электронной почте. Не стесняйтесь обращаться к нам, если у вас возникли вопросы или пожелания:

Email: Нажмите что бы посмотреть 

Что такое TheSlide.ru?

Это сайт презентации, докладов, проектов в PowerPoint. Здесь удобно  хранить и делиться своими презентациями с другими пользователями.


Для правообладателей

Яндекс.Метрика