Java Threads
Многозадачность
Многопоточнсть
Interface Runnable Method run Назначение ? Class Thread Method Назначение get. Name get. Priority is. Alive ? ? ? join sleep start ? ? ?
Main Thread (главный поток) Создается автоматически при старте программы public static void main(String args[]) { Thread t = Thread. current. Thread(); . . . }
Создание потока Два способа: • Реализовать интерфейс Runnable - имплементировать метод “run()” • Расширить класс Thread - переопределить метод “run()” Какой из способов лучше?
implements Runnable class My. Runnable implements Runnable { public void run() {. . . } } My. Runnable runnable = new My. Runnable(); new Thread(runnable). start();
extends Thread class My. Thread extends Thread { public void run() {. . . } } My. Thread thread = new My. Thread(); thread. start();
Anonymous thread Thread t 1 = new Thread() { public void run() {. . . } }; t 1. start(); Thread t 2 = new Thread(new Runnable() { public void run() {. . . } }); t 2. start();
Daemon Thread Обслуживающий поток My. Thread thread = new My. Thread(); thread. set. Daemon(true); . . .
Пример с поездами My. Thread train 1 = new My. Thread(); My. Thread train 2 = new My. Thread(); train 1. start(); train 2. start(); • Запись в один файл • Изменение объекта, переменной • etc.
Method sleep while (true) {. . . try { // Thread. sleep(10000); Time. Unit. SECONDS. sleep(10); } catch (Interrupted. Exception e) {. . . } }
Методы is. Alive & join is. Alive – проверка, выполняется ли поток while (intersection) { // перекресток if (!train 1. is. Alive()) train 2. start(); } join – ждем пока поток завершится try { train 1. join(); } catch (Interrupted. Exception e) {. . . } // можно ехать
Синхронизация Thread 1 Thread 2 Monitor Resource Thread 3
Механизмы синхронизации Синхронизированный метод public synchronized void do. Something() {. . . } Оператор syncronized public void do. Something() { synchronized (mutex) {. . . } }
Межпотоковые коммуникации Методы wait(), notify. All() synchronized void do. Something() throws Interrupted. Exception { if(need. To. Wait) { wait(); } call. Externall. System(); notify(); }
Жизненный цикл new ожидание блокировки / блокировка получена начал выполнение runnable закончил работу blocked terminated wait / notify, notify. All waiting wait, join, sleep / время истекло timed waiting
Deadlock (взаимная блокировка) Thread 1 Thread 2 synchronized
Пример deadlock class A { synchronized void method. A(B b) { b. do. Something(); } synchronized void do. Something() {. . . } } class B { synchronized void method. B(A a) { a. do. Something(); } synchronized void do. Something() {. . . } }
Home Work Нужно написать консольную программу, которая ищет файлы по какому-то паттерну. Программа должна быть многопоточная, но нельзя использовать пакет util. concurrent. Требуется добиться максимальной производительности. Паттерны могут быть *. doc, *. java и т. д. Интерфейс консольный: Ввод паттерна и директории, Вывод имен файлов и времени выполнения.