The 3rd part of the 3rd lecture from the course "Java Core".
The Department of Information and Network Technologies.
St-Petersburg State University Of Aerospace Instrumentation.
Russia
The 2nd part of the 3rd lecture from the course "Java Core".
The Department of Information and Network Technologies.
St-Petersburg State University Of Aerospace Instrumentation.
Russia
The 5-th lecture from the course "Java Core".
The Department of Information and Network Technologies.
St-Petersburg State University Of Aerospace Instrumentation.
Russia
The 1st part of the 3rd lecture from the course "Java Core".
The Department of Information and Network Technologies.
St-Petersburg State University Of Aerospace Instrumentation.
Russia
The 2-nd lecture from the course "Java Core".
The Department of Information and Network Technologies.
St-Petersburg State University Of Aerospace Instrumentation.
Russia
The 1-st lecture from the course "Java Core".
Chair of Information Net Technologies.
St-Petersburg State University Of Aerospace Instrumentation.
Russia
The 3rd part of the 6th lecture from the course "Java Core".
The Department of Information and Network Technologies.
St-Petersburg State University Of Aerospace Instrumentation.
Russia
The 2nd part of the 6th lecture from the course "Java Core".
The Department of Information and Network Technologies.
St-Petersburg State University Of Aerospace Instrumentation.
Russia
JavaScript - мой основной язык программирования, но два года я была в “Java-JavaScript” иммиграции, а последние полгода провела со Swift. Теперь, возвращаясь к JavaScript, я часто сравниваю, как там у “них”.
Этот доклад о том, чего мне не хватает в JavaScript, и почему JavaScript разработчику следует путешествовать в другие языки.
JavaScript - мой основной язык программирования, но два года я была в “Java-JavaScript” иммиграции, а последние полгода провела со Swift. Теперь, возвращаясь к JavaScript, я часто сравниваю, как там у “них”.
Этот доклад о том, чего мне не хватает в JavaScript, и почему JavaScript разработчику следует путешествовать в другие языки.
В презентации рассказывается о структурах памяти в JVM: Heap, Non-Heap, Stack, об атомарности операций и о garbage collector. Рассмотрен пример, как работает стек. Также, приведены примеры, как использовать jVisualVM и что она может показать.
Java SE 8 has brought lambdas, default methods, type annotations, compact profiles, etc. As a result, the Java SE platform specification was changed to reflect new features.
The session shows how the new Java 8 features have been implemented in Excelsior JET JVM, written from scratch, very different from the Oracle HotSpot JVM, but compatible with the Java SE specification.
As a result, an attendee will refresh his/her memory regarding new Java 8 features, will learn how they affected the JVM specification, how the lambda expressions are translated into Java bytecode and how they can be optimized at the JVM level.
Доклад на конференциях JPoint 2016, JBreak 2016
Abstract: В Java SE 8 были добавлены лямбда-выражения, дефолтные методы, типовые аннотации, компактные профили и т.п., что привело к изменениям в спецификации Java SE платформы.
В этом докладе мы рассмотрим, как новые возможности, добавленные в Java 8, были реализованы в Excelsior JET JVM, полностью написанной с нуля, совершенно непохожей на Oracle HotSpot, но при этом совместимой со спецификацией Java SE.
В итоге, слушатель освежит в памяти, что появилось в Java 8, как это повлияло на спецификацию JVM, во что превращаются лямбда-выражения в Java байт-коде, как их можно статически оптимизировать, а также получит некоторое представление о внутреннем устройстве еще одной JVM.
1. Язык программирования
JAVA
Лекция# 3 (Часть 3)
Реализация многопоточности в Java
Моисеенко Антон
canggu@mail.ru
СПГУАП
Кафедра Информационно-Сетевых Технологий
2. Содержание курса
■ Что такое поток?
■ Многопоточность в java
■ Состояние потока
■ Приоритет
■Класс java.lang.Thread
■ Два способа создать поток
■ Расширение класс Thread
■ Реализация интерфейса Runnable
■ Создание анонимного класса
■ Класс java.lang.ThreadGroup
■ Потоки и исключения
■ Планировщик потоков
■ Приоритет
■Остановка потока
3. Что такое поток?
• Определение:
– последовательность выполняемых операций
внутри программы.
• Для чего нужны потоки?
– Одновременное исполнение действий.
4. Многопоточность в Java
■ Каждое приложение на Java имеет по крайней мере
один пользовательский поток.
■ С точки зрения программирования, каждая
программа начинается с выполнения одного потока –
потока Main.
■ Main поток может создавать и запускать другие
потоки.
5. Состояния потока
• New – создан, но не запущен.
• Ready-to-run – готов к работе.
– Поток помещается в очередь, ожидающую доступа к
ресурсам ЦП.
• Running – активно использует ресурсы CPU.
• Blocked – ожидает ресурсов или событий.
• Waiting, Sleeping – поток перестал использовать ЦП.
– Самостоятельно или был принудительно снят с
исполнения.
7. Приоритет
• Позволяет определить порядок использования
ресурсов ЦП.
• Определение.
• Целое число от 1 до 10.
• Чем больше приоритет потока, тем у него больше
шансов получить управление.
8. Класс java.lang.Thread
■ Данный класс предоставляет абстракцию,
позволяющую выполнять инструкции языка Java в
отдельном потоке.
■ Имеет следующие конструкторы.
Thread() Создает новый класс.
Thread(String name) Создает новый именованный класс-
поток.
Thread(Runnable target) Создает новый класс-поток на основе
экземпляра Runnable, чей метод run()
будет исполняться в отдельном
потоке.
Thread(Runnable target,
String name)
Создает новый именованный класс-
поток на основе Runnable.
9. Класс java.lang.Thread (cont.)
■ Имеет несколько публичных полей, отражающих
относительные приоритеты.
public final static int MAX_PRIORITY Максимальный приоритет (10).
public final static int MIN_PRIORITY Минимальный приоритет (1).
public final static int NORM_PRIORITY Обычный приоритет (5).
10. Класс java.lang.Thread (cont.)
Среди методов класса можно выделить:
public static Thread currentThread() Возвращает ссылку на активный в настоящее
время поток.
public final String getName() Возвращает имя потока.
public final String setName(String name) Устанавливает имя потока.
public void interrupt() Прерывает поток.
public int getPriority() Возвращает приоритет потока.
public final boolean isAlive() Определяет, работает ли поток.
11. Класс java.lang.Thread (cont.)
public void run() Метод запускается в отдельном потоке.
public void start() Запускает выполнение метода run() в отдельном потоке.
public void join(Thread
other)
Приостанавливает исполнение текущего потока до тех пор пока поток other
не завершится.
public void stop() Завершает выполнение потока.
public void resume() Восстанавливает выполнение потока.
public void sleep(long delay) Приостанавливает выполнение потока на delay миллисекунд.
public void yield() Метод пробует отказаться от выполнения на ЦП в пользу других потоков.
12. Два способа создать поток
■ Наследование от класса Thread.
■ Реализация интерфейса Runnable.
13. Расширение класса Thread
■ Наследник класса Thread
переопределяет метод run().
■ Создается экземпляр подкласса.
■ Вызов метода start() данного подкласса
запускает выполнение потока.
○ Виртуальная машина начинает
выполнение потока вызовом метода run().
14. Две схемы запуска потока
■ Конструктор подкласса класса Thread
не вызывает метод start().
○ Нужно явно вызвать метод start() для
данного подкласса.
■ Помещение вызова метода start() в
конструктор подкласса класса Thread.
○ Создание экземпляра класса
автоматически запустит новый поток.
15. Пример создания потока (Thread)
class SimpleCombat extends Thread {
public void run(){
//конкретные действия поединка
takePosition();
fire();
}
…
}
//запуск инструкций в новом потоке
new SimpleCombat().start();
16. Интерфейс java.lang.Runnable
■ Интерфейс Runnable должен быть реализован
классом, предназначенным для выполнения в
отдельном потоке.
■ Класс должен реализовывать один метод run().
○ Этот метод похож на метод main(String s[]).
■ Экземпляр класса должен быть передан
конструктору класса Thread в качестве аргумента.
■ Запуск потока осуществляется методом start() класса
Thread.
17. Две схемы запуска потока
■ Конструктор класса, реализующего интерфейс
Runnable в своем конструкторе не вызывает метод
start().
○ Нужно явно вызвать метод start() для данного
класса.
■ Помещение вызова метода start() в конструктор
класса, реализующего интерфейс Runnable.
○ Создание экземпляра класса автоматически
запустит новый поток.
18. Пример создания потока (Runnable)
class SimpleCombat implements Runnable{
public void run(){
//конкретные действия поединка
takePosition();
fire();
}
}
SimpleCombat combat = new SimpleCombat();
new Thread(combat).start();
19. Наследование класса Thread и
реализация интерфейса Runnable
■ Реализация интерфейса.
○ Требует больше кода.
■ Реализация интерфейса.
■ Создание класса Thread.
○ Еще можно наследоваться от другого класса.
■ Наследование от класса Thread.
○ Проще в реализации.
○ Класс больше не может никого расширять.
■ Если нет других ограничений, то выбор между двумя
подходами – дело вкуса.
21. Класс java.lang.ThreadGroup
■ Потоки могут объединяться в группы
○ Группы могут включать в себя другие группы.
■ Потоку разрешено получать информацию о своей
группе.
○ Запрещено о других группах и о более крупных
группах (являющихся надгруппами).
■ Создается объект класса ThreadGroup и передается в
конструктор при создании объекта класса Thread.
22. Потоки и исключительные ситуации
■ Исключительная ситуация обрабатывается в следующем
порядке
○ в самом потоке
○ дается запрос на обработчик
UncaughtExceptionHandler через метод
Thread.getUncaughtExceptionHandler() и
вызывается метод uncaughtException() этого
обработчика
○ ThreadGroup выступает в качестве
UncaughtExceptionHandler
○ делается запрос в обработчик по умолчанию
Thread.getDefaultUncaughtExceptionHandler()
■ Если поток или группа потоков не обрабатывает
исключение, то оно обрабатывается JVM.
23. Потоки и исключительные ситуации
class MyThread extends Thread {
public void run() {
throw new RuntimeException("xxx");
}
}
class CustomHandler implements Thread.UncaughtExceptionHandler {
public void uncaughtException(Thread t, Throwable e) {
System.out.println("custom " + e.getMessage());
}
}
public class Test {
public static void main (String[] args) {
MyThread thr = new MyThread();
thr.setUncaughtExceptionHandler(new CustomHandler());
thr.start();
}
}
24. Планировщик потоков
Потоки соревнуются между собой за возможность быть
исполненными. Этот класс стремится избавиться от соперника:
class Hero extends Thread {
String name; //как зовут героя
Hero enemy; //кто враг и кого атаковать
public Combat(String name){ this.name = name; }
public void assignEnemy(Hero enemy){ this.enemy =
enemy;}
public void run(){
for (int i=0;i<=10000;i++)
System.out.println(name + “ hits “+ enemy ”+ i
+”times”);
}
}
25. Планировщик потоков (cont.)
Перед началом поединка нужно создать персонажи, назначить
соперников.
//создаем два персонажа:
Hero batman = new Hero(“Batman”);
Hero joker = new Hero(“Joker”);
//назначаем соперников:
batman.assignEnemy(joker);
joker.assignEnemy(batman);
//негодяй нападает первым:
joker.start();
batman.start();
Исход поединка определится тем, насколько часто один или другой поток
получат управление.
26. Приоритет
Потоку можно установить относительный приоритет выполнения.
// Приоритет назначается в зависимости от рода задачи,
выполняемой на нем
class Runner extends Thread{
public Runner(){
setPriority(Thread.MAX_PRIORITY);
//Thread.MIN_PRIORITY
//Thread.NORM_PRIORITY
start();
}
}
27. Остановка потока
Поток можно принудительно остановить, если
необходимость в нем отпала. Метод stop() использовать не
рекомендуется:
public class Combat extends Thread{
public Combat() {
//при создании экземпляра запускаем поток
this.start();
}
public void run(){
while (true){/*бой продолжается*/ }
}
}
//На другом потоке:
Thread combat = new Combat();
combat.stop();
28. Остановка потока (cont.)
Корректный способ остановки потока – с использованием
выхода из цикла:
public class FairCombat extends Thread {
volatile boolean win = false;
public void run(){
while (true){// бой продолжается
if(enemy.isEmpty()) {//до последнего противника
win = true;
return;
} /* или до победы*/
if (win) {return;}
}//while
}