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