Многопоточность. Возможности и преимущества многопоточности. Способы реализации. Механизмы синхронизации. (Лекция 7)

Содержание

Слайд 2

Содержание Возможности и преимущества многопоточности Способы реализации Механизмы синхронизации

Содержание

Возможности и преимущества многопоточности
Способы реализации
Механизмы синхронизации

Слайд 3

Возможности и преимущества многопоточности Одновременное обслуживание нескольких клиентов в конфигурации клиент-сервер

Возможности и преимущества многопоточности

Одновременное обслуживание нескольких клиентов в конфигурации клиент-сервер
Реализация систем

с активным участием пользователя в процессе вычислений (например, игры)
Оптимизация скорости работы за счет распараллеливания работы с «медленными» периферийными устройствами
Многопоточность не ускоряет систему
Слайд 4

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

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

Приоритет потока определяет долю квантов времени, выделяемых ему.
?

потоки низкого приоритета все равно продолжают исполняться
Потоки-демоны (daemon) – потоки специального назначения, чаще всего – обслуживающие
Приложение исполняется, пока существует хотя бы один «не-daemon» поток
Слайд 5

Поточная модель Java Поток – экземпляр класса Thread Методы класса Thread:

Поточная модель Java

Поток – экземпляр класса Thread
Методы класса Thread:
public static Thread

currentThread() – возвращает ссылку на поток из которого вызывается метод;
final String getName() – получить имя потока;
final void setName(String s) – задать имя потока;
final int getPriority() – приоритет потока (+ setPriority(int n), MIN_PRIORITY = 1, MAX_PRIORITY = 10, NORM_PRIORITY = 5);
final boolean isAlive() – позволяет выяснить исполняется поток или нет;
final void join() throws InterruptedException – ожидание завершения потока;
static void sleep(long n) throws InterruptedException – приостанавливает выполнение потока на n миллисекунд;
void run() – определяет точку входа в поток;
void start() – запускает поток, вызывая его метод run()
Слайд 6

Поточная модель Java Конструкторы класса Thread: Thread(Runnable threadOb); Thread(Runnable threadOb, String

Поточная модель Java

Конструкторы класса Thread:
Thread(Runnable threadOb);
Thread(Runnable threadOb, String name);

при запуске программы

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

Как создать поток? Поток в Java – экземпляр класса Thread Реализуем

Как создать поток?

Поток в Java – экземпляр класса Thread
Реализуем класс-наследник Thread
Переопределяем

метод void run()
Создаем экземпляр класса
Вызываем метод… start()
Виртуальная машина Java принимает решение о моменте запуска потока, производит его инициализацию и сама вызывает метод run()
Слайд 8

Как создать поток? public class MyThread extends Thread { public void

Как создать поток?

public class MyThread extends Thread {
public void run() {
//

вычисления
}
// метод start() реализовывать нельзя!
}
MyThread t = new MyThread();
t.start();
Слайд 9

Как создать поток? Наследование от Thread может привести к конфликту Реализуем

Как создать поток?

Наследование от Thread может привести к конфликту
Реализуем интерфейс Runnable
Создаем

класс, реализующий интерфейс Runnable
Реализуем метод void run()
Создаем экземпляр класса
Создаем экземпляр класса Thread, передавая в виде параметра ссылку на созданный экземпляр Runnable
Вызываем метод start() у класса Thread
Слайд 10

Как создать поток? public class MyThread implements Runnable { public void

Как создать поток?

public class MyThread
implements Runnable {
public void run() {
//

вычисления
}
}
Runnable r = new MyThread();
Thread t = new Thread(r);
t.start();
Слайд 11

Методы управления потоком Изнутри static void sleep(int mseconds) – приостановка работы

Методы управления потоком

Изнутри
static void sleep(int mseconds) – приостановка работы на указанное

число миллисекунд
static void yield() – приостановка работы и передача управления другим потокам (если они есть)
Снаружи
interrupt() – прерывание работы потока, у которого этот метод вызван. Порождает InterruptedException «внутрь» run()
Слайд 12

Синхронизация При одновременной работе с общими переменными результат непредсказуем: Изменение переменной

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

При одновременной работе с общими переменными результат непредсказуем:
Изменение переменной = чтение;

вычисления; запись (т.е. делается в несколько этапов)
Примеры: банковский счет, продажа билетов
Слайд 13

Блокировка Блокировка устанавливается на объект Блокировка объекта может быть установлена только

Блокировка

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

действия с объектом остаются доступными
Все другие потоки, попытавшиеся установить блокировку, ждут освобождения объекта
При выполнении блокировки локальная память потока полностью синхронизируется с общей; при снятии – аналогично (в обратную сторону)
Блокировка используется для обеспечения предсказуемости изменений объекта.
Слайд 14

Модификатор synchronized Объявление synchronized-блока synchronized (object) { … } Устанавливается блокировка

Модификатор synchronized

Объявление synchronized-блока
synchronized (object) {

}
Устанавливается блокировка на object
Объявление synchronized-метода
public void synchronized

process() {

}
Устанавливается блокировка на весь объект, содержащий synchronized-метод