Несколько полезных методов
Рассмотрим несколько полезных методов, которые могут пригодиться при работе с потоками.
1. Метод isAlive (). Этот метод возвращает true, если поток выполняется, и false, если не выполняется.
2. Метод jоin (). Он ждет завершения работы потока.
3. Метод wait (). Приостанавливает работу потока для предоставления работы с блоком кода другому потоку.
4. Метод notify (). Сообщает первому потоку, который вызвал wait (), что работа над блоком кода возможна.
5. Метод notifyAll (). Сообщает это же всем потокам, которые вызвали wait (). Выполняться будет поток с большим приоритетом (см. ниже).
6. Метод sleep (). Позволяет приостановить выполнение потока на какое-то количество миллисекунд.
7. Методы setPriorety () и getPriorety (). Устанавливает и возвращает приоритет потока (чем выше приоритет потока, тем больше у него прав на выполнение кода для двух конкурирующих потоков).
8. Метод yield (). Система приостанавливает выполнение этого потока и передает все ресурсы другим.
Синхронизация
Вернемся к обсуждению того, о чем мы говорили в начале этой темы, — блокировки. Блокировку для метода можно установить, например, с помощью ключевого слова synchronized. Объект, получивший возможность выполнять его первым, начинает его выполнять, и пока он не закончит работу с ним, другие объекты будут выстраиваться в очередь и выполнять его последовательно. Приведем пример (листинг 5.10).
Листинг 5.10.
Пример блокировки с использованием метода synchronized
При попытке вызвать метод Message второй создаваемый поток вынужден будет подождать, пока работу с объектом закончит первый.
Кроме того, в Java можно использовать блок synchronized, который работает аналогично методу synchronized. В блок помещаются операторы, а в параметрах блока указывается объект, который нужно синхронизировать (т.е. сделать доступным только для одного потока). Рассмотрим это на примере (листинг 5.11).
Листинг 5.11.
Пример блокировки с использованием блока synchronized
Аналогично можно поместить блок synchronized в метод run, указав в качестве объекта, который надо синхронизировать, объект е.
Во время выполнения программы возможна ситуация, когда два потока могут вызвать синхронизированные методы соседних классов. В таком случае говорят об обоюдной блокировке, или взаимоблокировке. Пусть у нас есть два объекта: object 1 и object2. Если они одновременно попытаются вызвать синхронизированные методы друг друга, это приведет к их взаимной блокировке (данная ситуация возможна не всегда, а только когда время выполнения потоков совпадет). Таких случаев по понятным причинам лучше не допускать.
Завершение работы потока
Поток завершается по окончании выполнения метода run — это нормальное явление. В более ранних версиях Java можно было искусственно завершать поток с помощью, например, метода stop (). Сейчас этот метод исключен из Java 2, и для остановки потоков необходимо использовать только метод run ().
Резюме
1. Обрабатывать исключения можно двумя способами: напрямую использовать классы для обработки исключений или применять блоки try/catch/ finally.
2. Для документации программы в формате HTML-файла достаточно добавить комментарий, а потом запустить утилиту javadoc.
3. Для документирования также используются теги. Они позволяют использовать специализированный формат документации.
4. Многопоточность— принцип построения программы, при котором в программе могут выполняться сразу несколько процессов. Единицей программы в таком случае будет поток.
5. Поток можно создавать в виде собственного класса, либо как наследника класса Thread, либо как реализацию интерфейса Runnable.
6. Чтобы метод или блок кода не выполнялся сразу двумя объектами, необходимо, чтобы объект, который первым вызвал этот поток, блокировал данный метод. Для этого в объявлении метода или блока кода необходимо поставить ключевое слово synchronized.
Вопросы
1. Что такое исключение?
2. Что такое класс Exception?
3. Что такое блок try/catch/finally?
4. Что такое утилита j avadoc и с каким типом комментариев она работает?
5. В каком виде представляется документированная версия вашего кода?
6. Что такое тег @author?
7. Что такое тег {@link} ?
8. Что такое принцип многопоточности?
9. Что такое поток?
10. Что такое класс Thread?
11. Что такое интерфейс Runnablе?
12. Что такое метод или блок кода с ключевым словом synchronized?
13. Что такое обоюдная блокировка?
14. Как можно приостанавливать выполнение потока?
15. Какие существуют основные методы для работы с потоками?
Контрольные упражнения
1. Создайте программу, которая использовала бы класс-исключение, в другом классе использовала бы его, а также имела документацию для каждого из классов.
2. Напишите программу, которая использует класс потока, созданный на основе класса Thread.
3. Переделайте программу из упражнения 2 так, чтобы класс потока был создан на основе реализации интерфейса Runnable.