Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Коллоквиум 2012.doc
Скачиваний:
27
Добавлен:
25.08.2019
Размер:
346.11 Кб
Скачать

8. Средства поддержки параллелизма. Активные и пассивные объекты. Класс Object

В Java параллелизм обеспечивается средствами языка: volatile переменные, synchronized блоки/методы, класс Tread, интерфейс Runnable, средства синхр. класса Object – wait(), notify(), notifyAll().

По своей сути, многопоточность явл-ся разновидностью многозадачности. Сущ. два типа многозадачности: на основе процессов и на основе потоков. Существенная разница состоит в том, что в то время, как каждый процесс имеет собственный набор переменных, потоки могут разделять одни и те же данные.  Несмотря на то, что Java-программы исп. многозадачные среды, основанные на процессах, эта многозадачность не нах-ся под прямым управлением Java; под ним нах-ся многозадачность на потоках. Все процессы имеют как минимум один поток выполнения, который наз-ся главным потоком, поскольку именно он вып-ся, когда программа начинает работу. Из главного потока можно создавать остальные, которые тоже могут создавать потоки и т.д. Поток может нах-ся в одном из состояний: он может выполняться, может быть готовым к выполнению, как только получит время ЦП. Выполняющийся поток может быть приостановлен, возобновлен; может быть заблокирован во время ожидания ресурса; выполнение потока может быть прекращено. Наряду с многозадачностью, основанной на потоках, возникает необходимость в синхронизации, которая позволяет координировать вып-ние потоков. Java обладает расширенной, интегрированной поддержкой синх-ции благодаря исп. монитора, которым обладает каждый объект, и ключевого слова synchronized. Два или более потока могут взаимодействовать друг с другом посредством методов, опред. классом Object. Этими методами явл-ся wait(), notify() и notifyAll(). Они позволяют одному потоку ожидать другой. Сущ. два основных типа потоков: поток пользователя и поток демона. Поток пользователя созд-ся по умолчанию. Программа продолжает выполнение до тех пор, пока сущ. хотя бы один активный поток пользователя. Состояние потока можно изменить на поток демона. Потоки демона автоматически прекращают свою работу, когда будет завершена работа всех потоков, не связ. с демонами. Потоки могут быть частью группы. Группа потоков позволяет коллективно управлять связанными потоками. Система многопоточности в Java построена на основе класса Thread и сопутствующего ему интерфейса Runnable. Класс Thread инкапсулирует поток выполнения. Чтобы создать новый поток, программа будет или реализ. интерфейс, или расширять класс Thread. И интерфейс, и класс нах-ся в пакете java.lang, => автоматически доступны всем программам.

Интерфейс Runnable абстрагирует модуль исполняемого кода. Можно создать поток в любом объекте, который реализует данный интерфейс. Runnable определяет только один метод void run(), внутри которого определяется код, образующий новый поток. Метод run() может вызвать другие методы, исп. другие классы и объявлять переменные; метод уст. точку входа для другого, параллельного потока выполнения внутри программы. Поток завершится, когда метод run() вернет рез-т. Класс Thread инкапсулирует поток. Thread опр. несколько методов, которые помогают управлять потоками. Метод start() вызывает метод run(), опр. в интерфейсе. Метод sleep() приостанавливает выполнение потока на опред. момент времени. Когда поток «спит», другой может выполнять свою работу, пока спящий не проснется.  Класс Thread опр-ет два набора конструкторов: один для создания потока в отдельном экземпляре класса Runnable, другой для создания потока в классах, расш. класс Thread. Для обоих наборов конструкторов поток будет создан как поток пользователя, если не оговорено иного.

Чтобы создать поток посредством реализации интерфейса Runnable, нужно: 1) Создать класс, реализ. интерфейс. 2) внутрь метода run(), опред. интерфейсом, поместить код, который должен вып-ся в потоке. 3) Создать экземпляр класса Runnable. 4) Создать объект Thread, передавая его в экземпляр Runnable. 5) Начать выполнение потока посредством метода start() на экземпляре Thread.

Чтобы создать поток посредством расширения класса  Thread, нужно: 1) Создать класс, который будет расширять Thread. 2) Переопределить метод run(), специфицировав код, который будет вып-ся в потоке. 3) Создать экземпляр класса, расш. Thread. 4) Начать вып-ние потока, вызвав метод start() на экземпляре.

Чтобы организовать взаим-вие между потоками с помощью wait() и notify(), необходимо: 1) чтобы поток ожидал уведомдение от нек. другого потока, нужно вызвать метод wait(). 2) чтобы уведомить ожид. поток – notify(). 3) как правило, поток исп. метод wait() для приостановки выполнения до тех пор, пока не произойдет нек. событие или пока не станет доступным общий ресурс. Он получает уведомление о том, что можно продолжить выполнение, когда другой поток вызывает метод notify(). Эти методы могут быть вызваны только из синхронизированного метода. Когда выполнение потока временно блокируется, он вызывает метод wait(), в рез-те поток «засыпает» и освобождается монитор для данного объекта. Это позволяет другому объекту исп. объект. Через нек. время спящий поток просыпается, когда нек. другой поток входит в тот же монитор и вызывает метод notify(), что приводит к возобновлению ожидающего метода. Несмотря на то, что метод wait() обычно ожидает вызова notify() или notifyAll(), сущ. вероятность, что в нек. случаях поток может быть разбужен вследствие фиктивного пробуждения. В этом случае ожидающий поток возобновляет выполнение без вызова notify() или notifyAll().

Методы stop(), suspend() и resume() начиная с версии Java 1.2 объявлены не рекомендуемыми. Метод suspend() отклонен из-за того, что его исп. может привести к возникновению взаимных блокировок. Метод resume() отклонен как дубликат suspend(). Метод stop() отклонен, т.к. по сути явл-ся небезопасным. Вызов метода stop() приведет к тому, что блокировки, удерж-мые этим потоком, будут освобождены. Это может привести к поврежд. синхрониз. объекта из-за преждевременного снятия блокировки.

Объекты могут быть активными и пассивными. Активный объект имеет свой поток управления, а пассивный - нет. Активный объект в общем случае автономен, то есть он может проявлять свое поведение без воздействия со стороны других объектов. Пассивный объект, напротив, может изменять свое состояние только под воздействием других объектов. Таким образом, активные объекты системы - источники управляющих воздействий. Если система имеет несколько потоков управления, то и активных объектов может быть несколько.