Программирование на JAVA
Меню :
Стартовая
Основы программирования
Программирование на JAVA
Программирование на C++
Программирование на Pascal
Задачи по программированию
.), то та-"^Й поток будет бездействовать определенное время, но при этом все
заблокированные им объекты будут оставаться недоступными для блокировок со стороны других потоков, а это потенциальный deadlock. Та кие ситуации крайне сложно выявить путем тестирования и отладки, г1о этому вопросам синхронизации надо уделять много времени на этагц проектирования.
Методы wait(), notify(), notifyAIIQ класса Object
Наконец, перейдем к рассмотрению трех методов класса Object, завершая описание механизмов поддержки многопоточности в Java.
Каждый объект в Java имеет не только блокировку для synchronized блоков и методов, но и так называемый 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;