try {…}
catch (xxxException e) {…}
……………………
catch (xxxException e) {…}
finally {…}
Организация обработки исключения
Поместить код, в котором может возникнуть исключение, в блок try. Отметить возможные ошибки и убедиться, что в каждом случае генерируется исключение. Организовать перехват и обработку всех исключений в блоках catch. При необходимости можно каждый оператор поместить в блок try. Сначала следует выполнять обработку более специфических исключений, затем – более общих. Например, сначала FileNotFoundException, затем IOException. Любое исключение должно быть либо обработано, либо описано в объявлении метода после ключевого слова throws. Тогда оно передается на обработку методу, вызвавшему данный метод.Определение собственных исключений
Необходимо определить подкласс Exception. Методы, унаследованные от Throwable: getMessage() – возвращает описание исключения. printStackTrace(). toString(). Необходим конструктор с праметром String.
26. Потоки вычислений: понятия потока; реализация потоков в Java; синхронизация и взаимодействие потоков.
Многозадачность поддерживается большинством современных ОС. Используются процессы и потоки. Процесс – автономно выполняющаяся программа. Имеет изолированное адресное пространство. ОС обеспечивает защиту. При взаимодействии процессов используется механизм коллективного доступа Inter Process Communication. ОС выделяет каждому процессу интервал времени ЦП.
Поток – независимая последовательность выполняемых ЦП команд. Главный поток может создавать другие потоки, используя средства ОС. Потоки выполняются автономно, независимо друг от друга в рамках одного процесса. Выполняются в адресном пространстве процесса, не защищены средствами ОС. Поток – облегченный процесс, легче запускается, проще переключаться.
Класс Thread
Поддержка многопоточности – с помощью методов класса java. lang. Thread.
7 конструкторов – без параметров [Thread myThread = new Thread()], с тремя параметрами (ThreadGroup tg, Runnable target, String name), и их комбинации. tg – группа потоков, в которую будет помещен создаваемый поток. По умолчанию становится членом текущей группы. target – объект, реализующий интерфейс Runnable. Имеет один метод – run(). Объект будет запускать данный поток. Если его нет – будет использоваться собственный метод run(). name – имя.
Методы:
- void start() – запускает поток на выполнение с помощью run(). Если вызвать второй раз – IllegalThreadStateException. Если поток используется для периодической работы, то run() содержит цикл. В цикле должна быть возможность приостановки, иначе JVM может быть перегружена его командами. static void sleep(long mills) – останавливает работу потока на указанное в миллисекундах время. Для уничтожения потока рекомендуется присвоить объекту значение null, и сборщик мусора его унитожит. getName() getPriority() isAlive() join() – ждать завершения потока.
Реализация потоков в Java
2 способа:
Создание класса, унаследованного от Thread и переопределение его метода run(). Реализация интерфейса RunnableПример: myApplet
{ …………..
Thread t = null;
public void start() { ………..
t = new Thread (this);
t. start(); }
public void stop() {………… t = null; }
public void run() {………….
try { Thread. sleep(100); }
catch (InterruptedException e) {……..}
}
Синхронизация потоков
Процессы выполняются в собственных адресных пространствах à защищены от воздействия друг на друга средствами ОС. Потоки не имеют такой защиты à любой поток в рамках одного процесса может получить доступ к данным, которые он считает принадлежащими только ему. основной механизм защиты в этом случае – синхронизация потоков. Java поддерживает синхронизацию на уровне языка. Она основана на блокировке.
Планировщик заданий ОС управляет распределением времени ЦП. При многопоточном программировании необходимо выделять методы и данные, выполнение и обработка которых не должны прерываться переходом процессора от одного потока к другому. Каждому объекту в Java ставиться в соответствие свойство блокировки. Потоки взаимодействуют в соответствии с протоколом, согласно которому любому действию над объектом должен предшествовать захват права на блокировку объекта. доступ другим потокам к заблокированному объекту будет закрыт, пока поток-владелец не снимет блокировку. Управление блокировкой – с помощью ключевого слова synchronized. При вызове synchronized-метода соответствующий объект блокируется. Никакой другой поток не может вызвать данный метод или другой synchronized-метод данного объекта. Несинхронизированные методы могут вызываться.
synchronized может использоваться как оператор, для блокировки отдельного участка кода.
synchronized (Object ob) {…}, где ob – ссылка на объект, который необходимо синхронизировать. Поток, войдя в этот участок кода, блокирует объект ob. Другой поток не сможет войти в этот участок кода, пока блокировка не будет снята.
Достоинства синхронизации:
- минимизация синхронизированного участка кода (повышение производительности) позволяет синхронизировать объекты, отличные от объекта, в котором находится synchronized-метод. позволяет блокировать внешний объект при обращении из внутреннего.
Взаимодействие потоков
Все методы определены в классе Object.
void wait() позволяет приостановить поток до выполнения некоторого условия.
void notify() оповещает поток, который вызвал wait() на том же самом объекте о том, что условие изменилось.
void notifyAll() оповещает все потоки на том же объекте.
Все три метода применяются только внутри синхронизированного кода.
synchronized void doWhenCondition()
{ while (!условие) wait();
………………………… // то, что выполняется при наличии условия
}
Условие ожидания обязательно проверяется в цикле. wait() освобождает блокировку объекта и приостанавливает работу потока, пока другой поток не вызовет метод notify(). Блокировка восстанавливается.
synchronized void changeCondidtion()
{………………………// изменить значение, использующееся в условии ожидания
notifyAll(); // notify();
}
при попытке использовать методы объекта, право на блокировку которого отсутствует – IllegalMonitorStateException.
Поток-диспетчер событий
Пакет AWT обеспечивает поддержку графического интерфейса пользователя, управляемого событиями. Когда пользователь выполняет действие, исполняющая система AWT генерирует событие AWTEvent. В нем фиксируется идентификатор события и ссылка на компонент-источник. Событие помещается в очередь событий EventQueue, поддерживаемую потоком-диспетчером событий event dispatch thread. Он извлекает из очереди очередное событие и отсылает его для обработки компоненту – источнику (с помощью методов класса EventQueue AWTEvent getNextEvent() и void dispatchEvent(AWTEvent e)). Событие может быть результатом не только действий пользователя, но и самой программы, например, repaint(). Оно вызывает событие paintEvent с идентификатором UPDATE. Блоки прослушивания получают уведомление при возникновении события (уведомления – просто сообщения, которые не производят никаких действий). Для paintEvent нет блока прослушивания. Он вызывает update(), а тот – paint().
Последовательность действий:
поток-диспетчер вызывает метод dispatchEvent(AWTEvent e)) на объекте – источнике событий. Он вызывает метод processEvent Тот вызывает метод processxxxEvent Вызывается соответствующий метод зарегистрированного блока прослушивания, в котором и выполняется обработка события.В соответствии с моделью делегирования событий, обработчики событии отделены от источников. Компонент делегирует событие другому объекту, метод которого обеспечивает обработку события.
Поток и исключения
Исключение всегда возникает в контексте определенного потока. Если оно не обработано к моменту завершения выполнения метода run(), то оно является необрабатываемым (uncaught exception). При этом JVM вызывает метод uncaughtException() объекта ThreadGroup той группы потоков, в которой находится поток, прекративший свое существование в результате исключения.
void uncaughtException (ThreadGroup tg, Throwable ta) предполагает вызов метода printStackTrace(), при это наверху иерархии методов, вызвавших исключение – метод run().
Потоки объединяются в группы в целях улучшения безопасности и управляемости. Класс ThreadGroup предоставляет методы для эффективного управления всеми потоками группы, например, общий приоритет выполнения. Установить принадлежность потока группе можно в конструкторе. По умолчанию он помещается в группу потока-родителя, если этому не противоречит менеджер безопасности.
27. Ввод/вывод в Java: понятия байтовых и символьных потоков; основные группы классов и интерфейсов пакета java. io
Система ввода-вывода в Java поддерживается библиотекой ядра API – пакетом java. io. Основным понятием является поток данных Stream. Поток данных – абстрактное представление упорядоченной последовательности данных, которой соответствует источник либо приемник. Потоки позволяют не вникать в особенности низкоуровневой организации ОС. Потоки связываются с устройствами ввода-вывода с помощью системы Java I/O System и скрывают детали процессов, которые происходят в реальных устройствах. 2 вида потоков – байтовые (для ввода-вывода информации в двоичной форме, в виде последовательности байтов) и символьные (для текстовой информации), которые появились в JDK 1.1 и представляют из себя последовательности символов в кодировке Unicode. Байтовые потоки: ввода и вывода (InputStream, OutputStream). Символьные потоки: чтения и записи (Reader, Writer). Это абстрактные классы. Появление Reader и Writer связано с удобством интернационализации на основе Unicode.
Основные группы классов и интерфейсов пакета java. io
1. Классы общего назначения, служащие для построения иерархии (InputStream, OutputStream, Reader, Writer) + классы-мосты (InputStreamReader – преобразует поток ввода в поток чтения и OutputStreamWriter)
2. Классы, определяющие разновидности символьных и байтовых потоков:
· Фильтрованные (Filter…)
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 |


