Презентация "Потоки выполнения. Java" - скачать презентации по Информатике

Содержание

Слайд 2

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

Введение

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




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

внешних ресурсов.
Смешение логически несвязанных фрагментов, которые должны
выполнятся параллельно.

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




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

© 2013 NetCracker Technology Corp. Confidential.

2

Слайд 3

Квантование времени Особенности процедуры квантования времени: • • • • •

Квантование времени

Особенности процедуры квантования времени:







Время делиться на интервалы (кванты времени)
Во время

одного кванта обрабатывается один поток данных
Решение о выборе потока принимается до начала интервала
Переключение между потоками с высокой частотой эмулирует многопоточность
Поддержка приоритетов для выполняемых потоков
Иллюзия одновременности!

© 2013 NetCracker Technology Corp. Confidential.

3

Слайд 4

Особенности многопоточности Особенности многопоточной архитектуры: • • • • Простота выделения

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

Особенности многопоточной архитектуры:





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

выполнение задач

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

при

разделении

задач

по


Недетерминизм

при

выполнении

© 2013 NetCracker Technology Corp. Confidential.

4

Слайд 5

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

Создание потоков. Класс Thread

Поток – экземпляр класса Thread. Для создания своего

потока исполнения необходимо
наследоваться от данного класса и переопределить метод run().


run() – метод, который содержит
действия, которые должны выполнятся в
потоке.
start() – унаследованный метод,
который сообщает виртуальной машине,
что необходимо запустить новый поток
исполнения и начать в нём выполнение
метода run().


© 2013 NetCracker Technology Corp. Confidential.

10/29/2010

5
Способ запуска:
MyThread t = new MyThread();
t.start();
Пример класса:
public class MyThread extends Thread {
public void run() {
// некоторое долгое вычисление
long sum = 0;
for (int i=0; i < 1000; i++) {
sum+=i;
}
System.out.println(sum);
}
}

Слайд 6

Интерфейс Runnable • • • Множественное наследование от класса Thread –

Интерфейс Runnable




Множественное наследование от класса Thread – может привести к конфликту!
Класс

Thread реализует интерфейс Runnable.

Runnable – интерфейс, в котором абстрагируется концепция некой
программу во время своей активности.

сущности,

выполняющей


Интерфейс Runnable

объявляет всего один метод – public void run();

© 2010 NetCracker Technology Corp. Confidential.

10/29/2010

6
Runnable r = new MyRunnable();
Thread t = new Thread(r);
t.start();
public class MyRunnable implements Runnable {
public void run() {
// некоторое долгое вычисление
long sum=0;
for (int i=0; i<1000; i++) {
sum+=i;
}
System.out.println(sum);
}
}

Слайд 7

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

Работа с потоками
Для работы с потоками и для управления ими существуют

следующие стандартные функции:






start() – запуск выполнения потока;
stop() – прекращение выполнения потока; suspend() – приостанавливает выполнение потока; resume() – возобновляет выполнение потока;

void
void void void

static void sleep (long millis) – приостанавливает выполнение потока как минимум на
millis миллисекунд;
static void yield() – приостанавливает выполнение потока, предоставляя возможность
выполнять другие потоки;
public final void join() – ожидание безусловного завершения потока, для которого
вызывается метод
public final synchronized void join(long millis) – ожидание завершения потока или
истечения заданного числа миллисекунд (в зависимости то того, что произойдёт раньше)
public final synchronized void join(long millis, int nanos) – ожидание





завершения

потока или тайм-аута с более точным контролем времени

© 2010 NetCracker Technology Corp. Confidential.

10/29/2010

7

Слайд 8

Группы потоков • • Каждый поток принадлежит к некоторой группе Потоки

Группы потоков



Каждый поток принадлежит к некоторой группе
Потоки делятся на группы потоков

в целях безопасности (ограничение возможностей, чтобы потоки не мешали друг другу)
Группа потоков может входить в состав другой группы (иерархия)
Потоки внутри группы могут изменять другие потоки, входящие в ту же
группу
Поток не может модифицировать потоки за пределами своей собственной и всех подчинённых групп
Ограничения, накладываемые на потоки, входящие в группу, описываются объектом ThreadGroup
Группа может задаваться в конструкторе потока
По умолчанию, каждый новый поток помещается в ту же группу, в которую входит его поток-создатель.
После завершения потока, соответствующий объект удаляется из группы








© 2010 NetCracker Technology Corp. Confidential.

10/29/2010

8

Слайд 9

Группы потоков Конструкторы и методы объекта ThreadGroup: • public Thread (ThreadGroup

Группы потоков
Конструкторы и методы объекта ThreadGroup:


public Thread (ThreadGroup group, String name)

– новый поток с заданным именем name (может быть
равно null), принадлежащий конкретной группе
public ThreadGroup (String name) – создаёт новую группу ThreadGroup
public ThreadGroup (ThreadGroup parent, String name) – создаёт новую группу ThreadGroup с заданным именем, принадлежающую указанной parent группе
public final String ThreadGroup.getName() – возвращает имя группы ThreadGroup
public final ThreadGroup ThreadGroup.getParent() – возвращает родительскую группу ThreadGroup или
null, если её не существует.
public final void setDaemon (boolean daemon) – устанавливает «демонический» статус группы/потока
public Thread.getThreadGroup – метод, позволяющий узнать, к какой группе принадлежит некоторый поток.
public final void Thread.checkAccess() – метод, позволяющий проверить допустима ли модификация потока
public final synchronized void setMaxPriority(int maxPri) – метод, задающий максимальный
приоритет группы
public final synchronized void destroy() – уничтожает текущую группу типа ThreadGroup (группа, в которой содержаться потоки, не может быть уничтожена)










© 2010 NetCracker Technology Corp. Confidential.

10/29/2010

9

Слайд 10

Приоритеты потоков • • • • Процедура квантования времени поддерживает приоритеты

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





Процедура квантования времени поддерживает приоритеты (priority) задач
Приоритет для задачи представляется

целым числом
Чем больше число – тем выше приоритет
Поток с более высоким приоритетом получает большее количество квантов времени на исполнение

Для работы с приоритетами существуют такие основные методы класса Thread:
getPriority(), setPriority()
а так же объявлены три константы:
MIN_PRIORITY, MAX_PRIORITY, NORM_PRIORITY

© 2010 NetCracker Technology Corp. Confidential.

10/29/2010

10

Слайд 11

Демон-потоки. Демон-группы class DaemonDemo extends Thread { public DaemonDemo() { super("Daemon

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

class DaemonDemo extends Thread {
public DaemonDemo() {
super("Daemon demo thread");


setDaemon(true);
start();
}
public void run() {
Thread threads[] = new Thread[10];

public class ThreadTest implements Runnable {

// Отдельная
// находится
public final

группа, в которой будут
все потоки ThreadTest
static ThreadGroup GROUP =

new ThreadGroup("Daemon demo");
// Стартовое значение
private int start;

public ThreadTest(int
start = (s % 2 ==
new Thread(GROUP,
}
public void run() {
try {

s) {
0) ? s : s+1;
this, "Thread

try

{
while (true) {
// Получаем
// тестовой
int count =

"+start).start();

набор всех потоков из
группы
ThreadTest.GROUP.activeCount();

if (threads.length < count)
threads = new Thread[count+10];

// Начинаем обратный отсчет
for (int i=start; i>0; i--) {
Thread.sleep(300);

count = ThreadTest.GROUP.enumerate(threads);

//
//
if

По достижению середины

порождаем новый

поток с половинным начальным
(start > 2 && i == start/2)
new ThreadTest(i);

значением

// Распечатываем имя каждого потока
for (int i=0; iSystem.out.print(threads[i].getName() + ",
System.out.println();

");

}

}
catch (InterruptedException e) {}

Thread.sleep(300);

}
public static void main(String s[]) {
new ThreadTest(16);
new DaemonDemo();
}

}

}
catch (InterruptedException e) {}

}

}

}

© 2010 NetCracker Technology Corp. Confidential.

10/29/2010

11

Слайд 12

Демон-потоки. Демон-группы Результатом программы будет: © 2010 NetCracker Technology Corp. Confidential.

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

Результатом программы будет:

© 2010 NetCracker Technology Corp. Confidential.

10/29/2010

12
Thread 16,
Thread

16,
Thread 16,
Thread 16,
Thread 16,
Thread 16,
Thread 16,
Thread 16,
Thread 16,
Thread 16, Thread 8,
Thread 16, Thread 8,
Thread 16, Thread 8,
Thread 16, Thread 8,
Thread 16, Thread 8,
Thread 16, Thread 8, Thread 4,
Thread 16, Thread 8, Thread 4,
Thread 8, Thread 4,
Thread 4, Thread 2,
Thread 2,
Слайд 13

Разделяемые ресурсы • Виртуальная машина поддерживает основное хранилище данных (main storage),

Разделяемые ресурсы


Виртуальная

машина

поддерживает

основное хранилище

данных

(main storage), в котором сохраняются
которое используется всеми потоками

значения всех

переменных и


Для

каждого

потока

создается его

собственная

рабочая

память

(working

memory),

в

которую

перед

использованием

копируются

значения всех переменных.

volatile поля всегда читаются/записываются из/в основной памяти.

© 2010 NetCracker Technology Corp. Confidential.

10/29/2010

13

Слайд 14

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

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


Синхронизированный блок
//Блокируется указанный объект
synchronized (<Ссылка на объект>)
{
<Тело блока синхронизации>
{


Синхронизированный метод
//Блокируется объект-владелец

метода
public synchronized void <Имя метода>()
{
<Тело метода>
}

© 2010 NetCracker Technology Corp. Confidential.

10/29/2010

14

Слайд 15

Блокировки • Только один поток в один момент времени может вызвать

Блокировки


Только один поток в один момент времени может вызвать синхронизированный метод

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




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


Блокировка

объекта

снимается

автоматически

при

прекращении

выполнения

синхронизированного метода (исключительная ситуация)
На объект возможно наложить блокировку и вызвать несколько синхронизированных
методов



Каждый объект имеет счётчик блокировок (lock count)
Поток может наложить блокировку на несколько объектов одновременно



Блокируется только объект, но не метод.

© 2010 NetCracker Technology Corp. Confidential.

10/29/2010

15

Слайд 16

Взаимные блокировки Взаимная блокировка (англ. deadlock) — при которой несколько потоков

Взаимные блокировки

Взаимная блокировка (англ. deadlock) —
при которой несколько потоков находятся
захваченных самими

этими потоками.

ситуация в многопоточном программировании,

в

состоянии

бесконечного

ожидания

ресурсов,

Пример простой взаимной блокировки

• В Java нет никаких средств распознавания или предотвращения ситуаций deadlock.
• Также нет способа перед вызовом синхронизированного метода узнать, заблокирован уже объект другим потоком.

ли

© 2010 NetCracker Technology Corp. Confidential.

10/29/2010

16

Слайд 17

Методы класса Object (notify, wait, notifyAll) • • Каждый объект в

Методы класса Object (notify, wait, notifyAll)



Каждый объект в Java имеет набор

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



Метод объекта
объекта

notifyAll()

пробуждает

все

потоки из wait-set группы


Любой из этих методов может быть вызван потоком у объекта только
после установления блокировки на этот объект
Потоки, после вызова метода wait() снимают все блокировки.



После

вызова

метода notify()

или

notifyAll()

потоки

пытаются

восстановить ранее снятые блокировки

© 2010 NetCracker Technology Corp. Confidential.

10/29/2010

17

Слайд 18

Запрещенные действия над потоками. Прерывание потока • Thread.suspend(), Thread.resume() – использование

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


Thread.suspend(), Thread.resume() – использование данных методов

приводит к
увеличению количества взаимных блокировок


Thread.stop()
объектов


использование

приводит

к

возникновению

повреждённых



public void interrupt () – изменяет статус потока на прерванный
public static boolean interrupted () – возвращает и очищает статус потока (прерван или нет)
public boolean isInterrupted () – возвращает статус потока (прерван или нет)


Если поток выполняет методы wait(), sleep, join(), прерывание потока методом
interrupt () приводит:


Поток прерывает своё выполнение с выбросом исключения InterruptedException

© 2010 NetCracker Technology Corp. Confidential.

10/29/2010

18

Слайд 19

Литература • • • Курс лекций МФТИ «Программирование на Java» Дж.

Литература




Курс лекций МФТИ «Программирование на Java»
Дж. Гослинг – Язык программирования Java.

3-e издание
http://www.intuit.ru/department/pl/javapl/12/1.html

© 2010 NetCracker Technology Corp. Confidential.

10/29/2010

19