Successfully reported this slideshow.
Your SlideShare is downloading. ×

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

Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Loading in …3
×

Check these out next

1 of 29 Ad

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

Download to read offline

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 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

Advertisement
Advertisement

More Related Content

Slideshows for you (20)

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

Advertisement

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

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

×