Java лаб 2.pptx
- Количество слайдов: 19
Понятие интерфейса (Java) • Интерфейс – тип данных, задающий только внешнее поведение объектов (описание услуг, предоставляемых классом). • Классы реализуют интерфейсы • Интерфейсы поддерживают множественное наследование
Понятие интерфейса (Java) public interface Moses extends Human, Prophet { String GOD_TO_PRAY= new String(“Yahweh”); //public final static void call. Ten. Plagues(); void feed. Jews(); void request. Tora(); void split. Sea(); } ………………………… void riseofthe. Jews(Moses m, int n 1, int n 2, int n 3) { int day; Moses m 2; m 2 = m; //m 2 будет псевдонимом Моисея m 2. speak. To. God(Moses. GOD_TO_PRAY); //инициализируем m 2. call. Ten. Plagues(); for (day=1; day
Аннотации (Java) • - Метаданные(доп. информация) в исходном коде • Появились начиная с Java 1. 5 , 1. 6 • Вводим новую аннотацию: public @interface Class. Description { String title(); int version() default 1; String text(); } • Если аннотация без элементов – она маркер (marker annotation type). • Аннотации можно ставить перед классами, методами переменными и package: @ Class. Description (title=“My. Class", version=2, text=“This is really important class") public class My. Class { /* */ }
Аннотации (Java) • Аннотации в отличии от Javadoc и обычных комментариев могут сохраняться после компиляции и влиять на выполнение кода; • Java reflect позволяет извлекать аннотации во время выполнения • Возможны аннотации на аннотации: @Retention(Retention. Policy. RUNTIME) // Доступ во время выполнения @Target({Element. Type. METHOD}) // Применима только к методам класса public @interface My. Reflect. Ann{ } • Могут влиять на работу компилятора: @Deprecated, @Override, @Suppress. Warnings • Существуют специальные плагины(дополнения) к компиляторам, обрабатывающие аннотации
Шаблоны (Java) • Шаблоны (generics, templates, параметризация) – позволяют использовать в определении классов (методов) неизвестные типы. Типы подставляются и проверяются на этапе компиляции. public class Entry
Шаблоны (Java) Еще пример generic метода: public static
Потоки выполнения (Java) • Поток в Java имеет ту же концепцию что и поток в ОС • 2 способа создания потока: 1) Переопределить метод класса Thread 2) Реализовать интерфейс (Runnable, Callable)
Потоки выполнения (Java) 1) package mypack. threadex; public class Custom. Thread extends Thread { @Override public void run() { System. out. println(“Thread is running"); } } ……………………………………. . Custom. Thread t= new Custom. Thread(); t. start();
Потоки выполнения (Java) 2) package mypack. threadex; class Custom. Runnable implements Runnable { @Override public void run() { System. out. println(" Thread is running"); } } ……………………………………. . Custom. Runnable cr= new Custom. Runnable(); Thread t 1 = new Thread(cr); Thread t 2 = new Thread(cr); t 1. start(); t 2. start();
Потоки выполнения (Java) • Запуск метода run() не создаст нового потока (выполнится в том же откуда вызван) • Для создания потока лучше использовать вариант с реализацией интерфейса • Повторный вызов start() выстрелит исключение даже после завершения потока • Порядок выполнения потоков случаен, не стоит делать предположений о том, какой поток выполнится первым • Потоки можно именовать: t. set. Name( «Поток"); /* получить имя текущего потока: */ Thread. current. Thread(). get. Name()
Потоки выполнения (Java) Диаграмма состояний: Thread. yield() – попытка перевести текущий поток в Runnable. Thread. sleep(x) – вызывает засыпание текущего потока на x миллисекунд. t. join(); - Ожидать пока не завершится поток t: Thread t = new Thread(some. Obj); t. start(); t. join();
Потоки выполнения (Java) Синхронизация потоков: • Проблема, когда несколько потоков могут получить доступ к одному ресурсу и изменить его данные до того как логически атомарная операция будет завершена другим потоком, известна как “состязание потоков”. • Если объекты класса могут безопасно использоваться несколькими потоками, этот класс помечается как threadsafe. • Если поле объекта специально несинхронизированно используется несколькими потоками, необходимо использовать модификатор volatile: private volatile int value;
Потоки выполнения (Java) • Синхронизация достигается при помощи блокировок: Каждый объект в Java имеет встроенный механизм блокировки, который вступает в игру только в том случае, если объект имеет синхронизированные методы. Когда мы входим в синхронизированный нестатический метод, мы автоматически получаем блокировку, связанную с текущим экземпляром класса (текущий – это тот, код которого выполняется в данный момент). • • Только методы (или блоки) могут быть synchronized. Каждый объект имеет только одну блокировку. Не все методы в классе нуждаются в синхронизации. Класс может иметь как синхронизированные методы, так и не синхронизированные. Если два потока собираются выполнить синхронизированный метод в классе, и оба потока используют один и тот же экземпляр класса для вызова метода, то только один поток сможет выполнить метод. Другой поток будет ждать пока первый не закончит выполнение метода. Иными словами, как только поток получает блокировку на объект, ни один другой поток не может войти ни в один из синхронизированных методов класса (для этого объекта).
Потоки выполнения (Java) • Если класс имеет и синхронизированные и не синхронизированные методы, то несколько потоков могут получить доступ к не синхронизированным методам класса. Если ваш метод не имеет доступа к данным, которые вы хотите защитить, то вам не нужно объявлять этот метод как синхронизированный. В некоторых случаях синхронизация может привести к взаимной блокировке, поэтому не стоит ей злоупотреблять. • Если поток уходит спать, он удерживает все свои блокировки, а не освобождает их. • Поток может захватить несколько блокировок. Например, поток может войти в синхронизированный метод, таким образом захватив блокировку, а затем сразу же вызвать синхронизированный метод другого объекта, получив также и его блокировку. • Можно синхронизировать не весь метод, а только блок кода.
Потоки выполнения (Java) • Пример: public synchronized void do. Stuff() { System. out. println("synchronized"); } Эквивалентен public void do. Stuff() { synchronized (this) { System. out. println("synchronized"); } } -----------------------------------------Static метод - Каждый загруженный класс в Java имеет соответствующий экземпляр класса java. lang. Class, представляющий этот класс. Именно этот объект и используется для защиты статических синхронизированных методов класса. public synchronized static void do. Stuff() { System. out. println("synchronized"); }
Потоки выполнения (Java) Deadlock (взаимная блокировка) Простейший случай deadlock —когда поток A получает блокировку ресурса R 1, затем пытается получить доступ к ресурсу R 2, который в это время уже захвачен потоком B, который в свою очередь пытается получить доступ к R 1.
Потоки выполнения (Java) Взаимодействие потоков: • 3 метода класса Object: wait(), notify. All() • wait() вызывается на объекте, на который уже есть блокировка: // поток a synchronized (b) { try { System. out. println("Ждем пока поток b выполнится. . . "); b. wait(); //ожидание, блок сбрасывается } catch (Interrupted. Exception e) { } ………………………………… // поток b public void run() { synchronized (this) { notify(); } }
Потоки выполнения (Java) Потоки - демоны: • • Поток, предоставляющий некоторый сервис, работающий в фоновом режиме и не являющийся неотъемлемой частью программы Если потоки не-демоны завершились, но остались работающие потокидемоны, программа все равно завершается. Чтобы сделать поток демоном, перед его запуском вызывается метод set. Daemon(true); Любой поток, запущенный из потока-демона, по умолчанию является демоном. Замечание: • Рекомендуемый сегодня способ создания потока – через исполнители (стр. 561 философии Java)
Java потоки http: //download. oracle. com/javase/7/doc s/api/ - java 1. 7 API http: //lib. rus. ec/b/231504 - библия =) http: //topcode. ru/2010/04/09/potoki-vjava/ - дополнительно про потоки http: //en. wikipedia. org/wiki/Generics_in_ Java - шаблоны в Java