- •Многопоточное программирование
- •Цели занятия
- •Понятие многопоточности
- •Реализация многопоточности
- •Реализация многопоточности
- •Особенности многопоточности
- •Использование класса Thread
- •Использование класса Thread
- •Использование класса Thread
- •Использование интерфейса
- •Использование интерфейса
- •Управление потоками
- •Нерекомендуемые действия над
- •Группы потоков
- •Группы потоков
- •Операции в группе потоков
- •Приоритеты потоков
- •Приоритеты потоков
- •Демон-потоки
- •Демон-группы потоков
- •Совместное использование
- •Совместное использование
- •Совместное использование
- •Совместное использование
- •Характерные ошибки
- •volatile
- •volatile
- •Специальные методы класса
- •Особенности использования
- •Прерывание потока
- •Пример
- •Пример
- •Пример
- •java.util.concurrent
- •java.util.concurrent
- •java.util.concurrent.locks
- •Lock Objects
- •ReentrantLock
- •Пример ReentrantLock
- •ReadWriteLock
- •Пример ReadWriteLock
- •Исполнители (Executors)
- •Интерфейсы исполнителей
- •Интерфейс Executor
- •Интерфейс
- •Thread Pools
- •Thread Pools
- •Executors
- •Пример ExecutorService
- •Пример ExecutorService.invokeAll()
- •InterruptedException
- •Прерывание потока
- •Пример InterruptedException
- •Пример восстановления статуса
- •Пример отменяемой задачи
- •Литература
Использование интерфейса
Runnable
11 • Запуск:
Runnable r = new MyThread(); Thread t = new Thread(r); t.start();
•Подчеркнем, что Runnable не является полной заменой классу Thread, поскольку создание и запуск самого потока исполнения возможно только через метод Thread.start()
Все права защищены. www.haulmont.ru info@haulmont.com |
© HAULMONT, 2013 |
Управление потоками
12 • void start()
Запускает выполнение потока
•void stop()
Прекращает выполнение потока
•void suspend()
Приостанавливает выполнение потока
•void resume()
Возобновляет выполнение потока
•static void sleep(long millis)
Останавливает выполнение потока как минимум на millis миллисекунд
•static void yield()
Приостанавливает выполнение потока, предоставляет возможность выполнять другие потоки
•void join()
Ожидает завершения указанного потока
Все права защищены. www.haulmont.ru info@haulmont.com |
© HAULMONT, 2013 |
Нерекомендуемые действия над
потоками
13 • Thread.suspend()
увеличивают количество взаимных блокировок
•Thread.resume()
увеличивают количество взаимных блокировок
•Thread.stop()
использование приводит к возникновению поврежденных объектов
Все права защищены. www.haulmont.ru info@haulmont.com |
© HAULMONT, 2013 |
Группы потоков
14• Каждый поток находится в группе
•Группа указывается при создании потока
•Если группа не была указана, то поток помещается в ту же группу, где находится поток, породивший его
•Группы потоков образуют дерево, корнем служит начальная группа
•Поток не имеет доступа к информации о родительской группе
•Изменение параметров и состояния группы влияет на все входящие в нее потоки
Все права защищены. www.haulmont.ru info@haulmont.com |
© HAULMONT, 2013 |
Группы потоков
15 • Создание группы:
//Без явного указания родительской группы
ThreadGroup group1 = new ThreadGroup("Group1");
//С явным указанием родительской группы
ThreadGroup group2 = new ThreadGroup(group1,
"Group2");
• Создание потока:
//Без явного указания группы MyThread t = new MyThread("Thread1"); //С явным указанием группы
MyThread t = new MyThread(group2, "Thread2");
Все права защищены. www.haulmont.ru info@haulmont.com |
© HAULMONT, 2013 |
Операции в группе потоков
16 • int activeCount()
Возвращает приблизительное количество действующих (активных) потоков группы, включая и те потоки, которые принадлежат вложенным группам. Количество нельзя считать точным, т.к. в момент выполнения метода оно может измениться – одни потоки «умирают», другие – создаются
•int enumerate(Thread[] list)
Заполняет массив list ссылками на объекты активных потоков группы и возвращает количество сохраненных ссылок. Также учитываются потоки, относящиеся ко всем вложенным группам
•int activeGroupCount()
Возвращает количество групп, включая вложенные
•int enumerate(ThreadGroup[] list)
Заполняет массив list ссылками на объекты вложенных групп потоков
•void interrupt()
Прерывает выполнение всех потоков в группе
Все права защищены. www.haulmont.ru info@haulmont.com |
© HAULMONT, 2013 |
Приоритеты потоков
17• Приоритет – количественный показатель важности потока
•Недетерминированно воздействует на системную политику упорядочивания потоков
•Базовый алгоритм не должен зависеть от схемы расстановки приоритетов потоков
•В Java потокам можно назначать приоритеты
•Для этого в классе Thread существуют методы getPriority() и setPriority(), а также объявлены три
Константы:
static int MAX_PRIORITY static int MIN_PRIORITY static int NORM_PRIORITY
•Их значения описывают максимальное, минимальное и нормальное (по умолчанию) значения приоритета
Все права защищены. www.haulmont.ru info@haulmont.com |
© HAULMONT, 2013 |
Приоритеты потоков
18 • Методы потока
final int getPriority() – возвращает ранее заданное значение приоритета выполнения для текущего потока
final void setPriority(int newPriority) –
устанавливает приоритет выполнения для текущего потока
• Методы группы потоков
final int getMaxPriority() – возвращает ранее заданное значение верхней границы приоритетов выполнения для текущей группы потоков
final void setMaxPriority(int maxPri) –
устанавливает верхнюю границу приоритетов выполнения для текущей группы потоков
Все права защищены. www.haulmont.ru info@haulmont.com |
© HAULMONT, 2013 |
Демон-потоки
19• Демон-потоки позволяют описывать фоновые процессы, которые нужны только для обслуживания основных потоков выполнения и не могут существовать без них
•Уничтожаются виртуальной машиной, если в группе не осталось не-демон потоков
•Пример демон-потока – сборщик мусора
•void setDaemon(boolean on) – устанавливает вид потока. Вызывается до запуска потока
•boolean isDaemon() – возвращает вид потока: true – демон, false – обычный
Все права защищены. www.haulmont.ru info@haulmont.com |
© HAULMONT, 2013 |
Демон-группы потоков
20• Демон-группа автоматически уничтожаются при останове последнего ее потока или уничтожении последней подгруппы потоков
•void setDaemon(boolean on) – устанавливает вид группы
•boolean isDaemon() – возвращает вид группы: true – демон, false – обычная
Все права защищены. www.haulmont.ru info@haulmont.com |
© HAULMONT, 2013 |
