Программирование на JAVA

Навигация

Лекция 1. Что такое Java? История создания

Лекция 2. Основы объектно-ориентированного программирования

Лекция 3. Лексика языка

Лекция 4. Типы данных

Лекция 5. Имена. Пакеты

Лекция 6. Объявление классов

Лекция 7. Преобразование типов

Лекция 8. Объектная модель в Java

Лекция 9. Массивы

Лекция 10. Операторы и структура кода. Исключения

Лекция 11. Пакет java.awt

Лекция 12. Потоки выполнения. Синхронизация

Лекция 13. Пакет java.lang

Лекция 14. Пакет java.util

Лекция 15. Пакет java.io

Лекция 16. Введение в сетевые протоколы

.), то та-"^Й поток будет бездействовать определенное время, но при этом все

заблокированные им объекты будут оставаться недоступными для бло­кировок со стороны других потоков, а это потенциальный deadlock. Та кие ситуации крайне сложно выявить путем тестирования и отладки, г1о этому вопросам синхронизации надо уделять много времени на этагц проектирования.

Методы wait(), notify(), notifyAIIQ класса Object

Наконец, перейдем к рассмотрению трех методов класса Object, за­вершая описание механизмов поддержки многопоточности в Java.

Каждый объект в Java имеет не только блокировку для synchro­nized блоков и методов, но и так называемый wait-set, набор потоков исполнения. Любой поток может вызвать метод wait() любого объекта и таким образом попасть в его wait-set. При этом выполнение такого по­тока приостанавливается до тех пор, пока другой поток не вызовет у этого же объекта метод notifyAII(), который пробуждает все потоки из wait-set. Метод notify() пробуждает один случайно выбранный поток из данного набора.

Однако применение этих методов связано с одним важным ограниче­нием. Любой из них может быть вызван потоком у объекта только после ус­тановления блокировки на этот объект. То есть либо внутри synchronized-блока с ссылкой на этот объект в качестве аргумента, либо обращения к ме­тодам должны быть в синхронизированных методах класса самого объекта. Рассмотрим пример:

public class WaitThread implements Runnable { private Object shared;

public WaitThread(Object o) { shared=o;

}

public void run() {

synchronized (shared) { try{

shared.wait(); } catch (InterruptedException e) {} System.out.println("after wait");

}

public static void main(String s[]) { Object o = new Object(); WaitThread w = new WaitThread(o); new Thread(w).start(); try{

Thread.sleep(100); } catch (InterruptedException e) {} System .out. printlnfbef ore notify"); synchronized (o) {

o. notify All ();

} }

Результатом программы будет:

before notify after wait

Обратите внимание, что метод wait(), как и sleepO, требует обработки ItfterruptedException, то есть его выполнение также можно прервать мето­дом interrupt().

В заключение рассмотрим более сложный пример для трех потоков:

public class ThreadTest implements Runnable {

final static private Object shared=new ObjectQ; private int type; public ThreadTest(int i) { type=i;