SlideShare a Scribd company logo
1 of 29
Язык программирования
JAVA
Лекция# 3 (Часть 3)
Реализация многопоточности в Java
Моисеенко Антон
canggu@mail.ru
СПГУАП
Кафедра Информационно-Сетевых Технологий
Содержание курса
■ Что такое поток?
■ Многопоточность в java
■ Состояние потока
■ Приоритет
■Класс java.lang.Thread
■ Два способа создать поток
■ Расширение класс Thread
■ Реализация интерфейса Runnable
■ Создание анонимного класса
■ Класс java.lang.ThreadGroup
■ Потоки и исключения
■ Планировщик потоков
■ Приоритет
■Остановка потока
Что такое поток?
• Определение:
– последовательность выполняемых операций
внутри программы.
• Для чего нужны потоки?
– Одновременное исполнение действий.
Многопоточность в Java
■ Каждое приложение на Java имеет по крайней мере
один пользовательский поток.
■ С точки зрения программирования, каждая
программа начинается с выполнения одного потока –
потока Main.
■ Main поток может создавать и запускать другие
потоки.
Состояния потока
• New – создан, но не запущен.
• Ready-to-run – готов к работе.
– Поток помещается в очередь, ожидающую доступа к
ресурсам ЦП.
• Running – активно использует ресурсы CPU.
• Blocked – ожидает ресурсов или событий.
• Waiting, Sleeping – поток перестал использовать ЦП.
– Самостоятельно или был принудительно снят с
исполнения.
Состояния потока
Приоритет
• Позволяет определить порядок использования
ресурсов ЦП.
• Определение.
• Целое число от 1 до 10.
• Чем больше приоритет потока, тем у него больше
шансов получить управление.
Класс java.lang.Thread
■ Данный класс предоставляет абстракцию,
позволяющую выполнять инструкции языка Java в
отдельном потоке.
■ Имеет следующие конструкторы.
Thread() Создает новый класс.
Thread(String name) Создает новый именованный класс-
поток.
Thread(Runnable target) Создает новый класс-поток на основе
экземпляра Runnable, чей метод run()
будет исполняться в отдельном
потоке.
Thread(Runnable target,
String name)
Создает новый именованный класс-
поток на основе Runnable.
Класс 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).
Класс 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() Определяет, работает ли поток.
Класс 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() Метод пробует отказаться от выполнения на ЦП в пользу других потоков.
Два способа создать поток
■ Наследование от класса Thread.
■ Реализация интерфейса Runnable.
Расширение класса Thread
■ Наследник класса Thread
переопределяет метод run().
■ Создается экземпляр подкласса.
■ Вызов метода start() данного подкласса
запускает выполнение потока.
○ Виртуальная машина начинает
выполнение потока вызовом метода run().
Две схемы запуска потока
■ Конструктор подкласса класса Thread
не вызывает метод start().
○ Нужно явно вызвать метод start() для
данного подкласса.
■ Помещение вызова метода start() в
конструктор подкласса класса Thread.
○ Создание экземпляра класса
автоматически запустит новый поток.
Пример создания потока (Thread)
class SimpleCombat extends Thread {
public void run(){
//конкретные действия поединка
takePosition();
fire();
}
…
}
//запуск инструкций в новом потоке
new SimpleCombat().start();
Интерфейс java.lang.Runnable
■ Интерфейс Runnable должен быть реализован
классом, предназначенным для выполнения в
отдельном потоке.
■ Класс должен реализовывать один метод run().
○ Этот метод похож на метод main(String s[]).
■ Экземпляр класса должен быть передан
конструктору класса Thread в качестве аргумента.
■ Запуск потока осуществляется методом start() класса
Thread.
Две схемы запуска потока
■ Конструктор класса, реализующего интерфейс
Runnable в своем конструкторе не вызывает метод
start().
○ Нужно явно вызвать метод start() для данного
класса.
■ Помещение вызова метода start() в конструктор
класса, реализующего интерфейс Runnable.
○ Создание экземпляра класса автоматически
запустит новый поток.
Пример создания потока (Runnable)
class SimpleCombat implements Runnable{
public void run(){
//конкретные действия поединка
takePosition();
fire();
}
}
SimpleCombat combat = new SimpleCombat();
new Thread(combat).start();
Наследование класса Thread и
реализация интерфейса Runnable
■ Реализация интерфейса.
○ Требует больше кода.
■ Реализация интерфейса.
■ Создание класса Thread.
○ Еще можно наследоваться от другого класса.
■ Наследование от класса Thread.
○ Проще в реализации.
○ Класс больше не может никого расширять.
■ Если нет других ограничений, то выбор между двумя
подходами – дело вкуса.
Создание анонимного класса
new Thread() {
public void run(){
//код
}
}.start();
Класс java.lang.ThreadGroup
■ Потоки могут объединяться в группы
○ Группы могут включать в себя другие группы.
■ Потоку разрешено получать информацию о своей
группе.
○ Запрещено о других группах и о более крупных
группах (являющихся надгруппами).
■ Создается объект класса ThreadGroup и передается в
конструктор при создании объекта класса Thread.
Потоки и исключительные ситуации
■ Исключительная ситуация обрабатывается в следующем
порядке
○ в самом потоке
○ дается запрос на обработчик
UncaughtExceptionHandler через метод
Thread.getUncaughtExceptionHandler() и
вызывается метод uncaughtException() этого
обработчика
○ ThreadGroup выступает в качестве
UncaughtExceptionHandler
○ делается запрос в обработчик по умолчанию
Thread.getDefaultUncaughtExceptionHandler()
■ Если поток или группа потоков не обрабатывает
исключение, то оно обрабатывается JVM.
Потоки и исключительные ситуации
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();
}
}
Планировщик потоков
Потоки соревнуются между собой за возможность быть
исполненными. Этот класс стремится избавиться от соперника:
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”);
}
}
Планировщик потоков (cont.)
Перед началом поединка нужно создать персонажи, назначить
соперников.
//создаем два персонажа:
Hero batman = new Hero(“Batman”);
Hero joker = new Hero(“Joker”);
//назначаем соперников:
batman.assignEnemy(joker);
joker.assignEnemy(batman);
//негодяй нападает первым:
joker.start();
batman.start();
Исход поединка определится тем, насколько часто один или другой поток
получат управление.
Приоритет
Потоку можно установить относительный приоритет выполнения.
// Приоритет назначается в зависимости от рода задачи,
выполняемой на нем
class Runner extends Thread{
public Runner(){
setPriority(Thread.MAX_PRIORITY);
//Thread.MIN_PRIORITY
//Thread.NORM_PRIORITY
start();
}
}
Остановка потока
Поток можно принудительно остановить, если
необходимость в нем отпала. Метод stop() использовать не
рекомендуется:
public class Combat extends Thread{
public Combat() {
//при создании экземпляра запускаем поток
this.start();
}
public void run(){
while (true){/*бой продолжается*/ }
}
}
//На другом потоке:
Thread combat = new Combat();
combat.stop();
Остановка потока (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
}
Вопросы?

More Related Content

What's hot

C++ STL & Qt. Занятие 08.
C++ STL & Qt. Занятие 08.C++ STL & Qt. Занятие 08.
C++ STL & Qt. Занятие 08.Igor Shkulipa
 
C++ STL & Qt. Занятие 04.
C++ STL & Qt. Занятие 04.C++ STL & Qt. Занятие 04.
C++ STL & Qt. Занятие 04.Igor Shkulipa
 
C++ весна 2014 лекция 5
C++ весна 2014 лекция 5C++ весна 2014 лекция 5
C++ весна 2014 лекция 5Technopark
 
C++ STL & Qt. Занятие 10.
C++ STL & Qt. Занятие 10.C++ STL & Qt. Занятие 10.
C++ STL & Qt. Занятие 10.Igor Shkulipa
 
C++ STL & Qt. Занятие 03.
C++ STL & Qt. Занятие 03.C++ STL & Qt. Занятие 03.
C++ STL & Qt. Занятие 03.Igor Shkulipa
 
C++ осень 2013 лекция 4
C++ осень 2013 лекция 4C++ осень 2013 лекция 4
C++ осень 2013 лекция 4Technopark
 
C++ STL & Qt. Занятие 05.
C++ STL & Qt. Занятие 05.C++ STL & Qt. Занятие 05.
C++ STL & Qt. Занятие 05.Igor Shkulipa
 
C++ Базовый. Занятие 15.
C++ Базовый. Занятие 15.C++ Базовый. Занятие 15.
C++ Базовый. Занятие 15.Igor Shkulipa
 
C++ STL & Qt. Занятие 01.
C++ STL & Qt. Занятие 01.C++ STL & Qt. Занятие 01.
C++ STL & Qt. Занятие 01.Igor Shkulipa
 
Java. Многопоточность.
Java. Многопоточность.Java. Многопоточность.
Java. Многопоточность.Unguryan Vitaliy
 
Java осень 2014 занятие 3
Java осень 2014 занятие 3Java осень 2014 занятие 3
Java осень 2014 занятие 3Technopark
 
C++ STL & Qt. Занятие 07.
C++ STL & Qt. Занятие 07.C++ STL & Qt. Занятие 07.
C++ STL & Qt. Занятие 07.Igor Shkulipa
 
C++ STL & Qt. Занятие 09.
C++ STL & Qt. Занятие 09.C++ STL & Qt. Занятие 09.
C++ STL & Qt. Занятие 09.Igor Shkulipa
 

What's hot (14)

C++ STL & Qt. Занятие 08.
C++ STL & Qt. Занятие 08.C++ STL & Qt. Занятие 08.
C++ STL & Qt. Занятие 08.
 
C++ STL & Qt. Занятие 04.
C++ STL & Qt. Занятие 04.C++ STL & Qt. Занятие 04.
C++ STL & Qt. Занятие 04.
 
C++ весна 2014 лекция 5
C++ весна 2014 лекция 5C++ весна 2014 лекция 5
C++ весна 2014 лекция 5
 
C++ STL & Qt. Занятие 10.
C++ STL & Qt. Занятие 10.C++ STL & Qt. Занятие 10.
C++ STL & Qt. Занятие 10.
 
C++ STL & Qt. Занятие 03.
C++ STL & Qt. Занятие 03.C++ STL & Qt. Занятие 03.
C++ STL & Qt. Занятие 03.
 
C++ осень 2013 лекция 4
C++ осень 2013 лекция 4C++ осень 2013 лекция 4
C++ осень 2013 лекция 4
 
C++ STL & Qt. Занятие 05.
C++ STL & Qt. Занятие 05.C++ STL & Qt. Занятие 05.
C++ STL & Qt. Занятие 05.
 
C++ Базовый. Занятие 15.
C++ Базовый. Занятие 15.C++ Базовый. Занятие 15.
C++ Базовый. Занятие 15.
 
Классы и объекты С#
Классы и объекты С#Классы и объекты С#
Классы и объекты С#
 
C++ STL & Qt. Занятие 01.
C++ STL & Qt. Занятие 01.C++ STL & Qt. Занятие 01.
C++ STL & Qt. Занятие 01.
 
Java. Многопоточность.
Java. Многопоточность.Java. Многопоточность.
Java. Многопоточность.
 
Java осень 2014 занятие 3
Java осень 2014 занятие 3Java осень 2014 занятие 3
Java осень 2014 занятие 3
 
C++ STL & Qt. Занятие 07.
C++ STL & Qt. Занятие 07.C++ STL & Qt. Занятие 07.
C++ STL & Qt. Занятие 07.
 
C++ STL & Qt. Занятие 09.
C++ STL & Qt. Занятие 09.C++ STL & Qt. Занятие 09.
C++ STL & Qt. Занятие 09.
 

Similar to Java Core. Lecture# 3. Part# 3. Multithreading.

8. java lecture threads
8. java lecture threads8. java lecture threads
8. java lecture threadsMERA_school
 
Java весна 2014 лекция 5
Java весна 2014 лекция 5Java весна 2014 лекция 5
Java весна 2014 лекция 5Technopark
 
Android - 02 - annotations, exceptions, io, generics
Android - 02 - annotations, exceptions, io, genericsAndroid - 02 - annotations, exceptions, io, generics
Android - 02 - annotations, exceptions, io, genericsNoveo
 
Елена Жукова "Жизнь вне JavaScript"
Елена Жукова "Жизнь вне JavaScript"Елена Жукова "Жизнь вне JavaScript"
Елена Жукова "Жизнь вне JavaScript"Fwdays
 
JPoint 2016 - Etudes of DIY Java profiler
JPoint 2016 - Etudes of DIY Java profilerJPoint 2016 - Etudes of DIY Java profiler
JPoint 2016 - Etudes of DIY Java profilerAnton Arhipov
 
Svitla .Net meetup in Kiev, Anzhiiak Oleksii
Svitla .Net meetup in Kiev, Anzhiiak OleksiiSvitla .Net meetup in Kiev, Anzhiiak Oleksii
Svitla .Net meetup in Kiev, Anzhiiak OleksiiSvitla Systems Inc.
 
Лекция 6
Лекция 6Лекция 6
Лекция 6itc73
 
Память в Java. Garbage Collector
Память в Java. Garbage CollectorПамять в Java. Garbage Collector
Память в Java. Garbage CollectorOlexandra Dmytrenko
 
Programming Java - Lection 06 - Multithreading - Lavrentyev Fedor
Programming Java - Lection 06 - Multithreading - Lavrentyev FedorProgramming Java - Lection 06 - Multithreading - Lavrentyev Fedor
Programming Java - Lection 06 - Multithreading - Lavrentyev FedorFedor Lavrentyev
 
Oop java.generics
Oop java.genericsOop java.generics
Oop java.genericsmuqaddas_m
 
Java 8 Support at the JVM Level
Java 8 Support at the JVM LevelJava 8 Support at the JVM Level
Java 8 Support at the JVM LevelNikita Lipsky
 
Java весна 2013 лекция 9
Java весна 2013 лекция 9Java весна 2013 лекция 9
Java весна 2013 лекция 9Technopark
 
Многопоточность, работа с сетью (Lecture 12 – multithreading, network)
Многопоточность, работа с сетью (Lecture 12 – multithreading, network)Многопоточность, работа с сетью (Lecture 12 – multithreading, network)
Многопоточность, работа с сетью (Lecture 12 – multithreading, network)Noveo
 
Классы и объекты в Java
Классы и объекты в JavaКлассы и объекты в Java
Классы и объекты в Javametaform
 
Поддержка Java 8 в Excelsior JET
Поддержка Java 8 в Excelsior JET Поддержка Java 8 в Excelsior JET
Поддержка Java 8 в Excelsior JET Nikita Lipsky
 
Java осень 2014 занятие 5
Java осень 2014 занятие 5Java осень 2014 занятие 5
Java осень 2014 занятие 5Technopark
 

Similar to Java Core. Lecture# 3. Part# 3. Multithreading. (20)

java
javajava
java
 
8. java lecture threads
8. java lecture threads8. java lecture threads
8. java lecture threads
 
Lec 14
Lec 14Lec 14
Lec 14
 
Java весна 2014 лекция 5
Java весна 2014 лекция 5Java весна 2014 лекция 5
Java весна 2014 лекция 5
 
Android - 02 - annotations, exceptions, io, generics
Android - 02 - annotations, exceptions, io, genericsAndroid - 02 - annotations, exceptions, io, generics
Android - 02 - annotations, exceptions, io, generics
 
Елена Жукова "Жизнь вне JavaScript"
Елена Жукова "Жизнь вне JavaScript"Елена Жукова "Жизнь вне JavaScript"
Елена Жукова "Жизнь вне JavaScript"
 
JPoint 2016 - Etudes of DIY Java profiler
JPoint 2016 - Etudes of DIY Java profilerJPoint 2016 - Etudes of DIY Java profiler
JPoint 2016 - Etudes of DIY Java profiler
 
Svitla .Net meetup in Kiev, Anzhiiak Oleksii
Svitla .Net meetup in Kiev, Anzhiiak OleksiiSvitla .Net meetup in Kiev, Anzhiiak Oleksii
Svitla .Net meetup in Kiev, Anzhiiak Oleksii
 
Step 7
Step 7Step 7
Step 7
 
Лекция 6
Лекция 6Лекция 6
Лекция 6
 
Память в Java. Garbage Collector
Память в Java. Garbage CollectorПамять в Java. Garbage Collector
Память в Java. Garbage Collector
 
Programming Java - Lection 06 - Multithreading - Lavrentyev Fedor
Programming Java - Lection 06 - Multithreading - Lavrentyev FedorProgramming Java - Lection 06 - Multithreading - Lavrentyev Fedor
Programming Java - Lection 06 - Multithreading - Lavrentyev Fedor
 
Oop java.generics
Oop java.genericsOop java.generics
Oop java.generics
 
Java 8 Support at the JVM Level
Java 8 Support at the JVM LevelJava 8 Support at the JVM Level
Java 8 Support at the JVM Level
 
Java весна 2013 лекция 9
Java весна 2013 лекция 9Java весна 2013 лекция 9
Java весна 2013 лекция 9
 
Многопоточность, работа с сетью (Lecture 12 – multithreading, network)
Многопоточность, работа с сетью (Lecture 12 – multithreading, network)Многопоточность, работа с сетью (Lecture 12 – multithreading, network)
Многопоточность, работа с сетью (Lecture 12 – multithreading, network)
 
Классы и объекты в Java
Классы и объекты в JavaКлассы и объекты в Java
Классы и объекты в Java
 
Поддержка Java 8 в Excelsior JET
Поддержка Java 8 в Excelsior JET Поддержка Java 8 в Excelsior JET
Поддержка Java 8 в Excelsior JET
 
Thread
ThreadThread
Thread
 
Java осень 2014 занятие 5
Java осень 2014 занятие 5Java осень 2014 занятие 5
Java осень 2014 занятие 5
 

Java Core. Lecture# 3. Part# 3. Multithreading.

  • 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. ○ Проще в реализации. ○ Класс больше не может никого расширять. ■ Если нет других ограничений, то выбор между двумя подходами – дело вкуса.
  • 20. Создание анонимного класса new Thread() { public void run(){ //код } }.start();
  • 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 }