Программирование на JAVA
Меню :
Стартовая
Основы программирования
Программирование на JAVA
Программирование на C++
Программирование на Pascal
Задачи по программированию
}
public void run() {
if (type—1 || type==2){ synchronized (shared) {
try{
shared.wait(); } catch (InterruptedException e) {} System. out. pri ntln ("Thread "+type+
" after wait()");
}
) else {
synchronized (shared) {
shared.notifyAII();
System.out.println("Thread "+type+ " after notifyAII()");
}
}
}
public static void main(String s[]) { Threadiest w1 = new ThreadTest( 1); new Thread(w1 ).start(); try {
Thread.sleep(100); } catch (InterruptedException e) {} Threadiest w2 = new ThreadTest(2); new Thread(w2).start(); try {
Thread.sleep(tOO); } catch (InterruptedException e) {} Threadiest w3 = new ThreadTest(3); new Thread(w3).start(); }
}
Результатом работы программы будет:
Thread 3 after notifyAII() Thread 1 after wait() Thread 2 after wait()
Рассмотрим, что произошло. Во-первых, был запущен поток 1, который тут же вызвал метод wait() и приостановил свое выполнение. Затем то же самое произошло с потоком 2. Далее начинает выполняться поток 3-
Сразу обращает на себя внимание следующий факт. Еще поток 1 во-шел в synchronized-блок, а стало быть, установил блокировку на объект shared. Но, судя по результатам, это не помешало и потоку 2 зайти в syn-chronized-блок, а затем и потоку 3. Причем, для последнего это просто необходимо, иначе как можно "разбудить" потоки 1 и 2?
Можно сделать вывод, что потоки, прежде чем приостановить выполнение после вызова метода wait(), отпускают все занятые блокировки-Итак, вызывается метод notifyAII(). Как уже было сказано, все потоки и3 wait-set возобновляют свою работу. Однако чтобы корректно продолжить
Яр*»--
волнение, необходимо вернуть блокировку на объект, ведь следующая й і также находится внутри synchronized-блока!
Получается, что даже после вызова notifyAII() все потоки не могут сра-возобновить работу. Лишь один из них сможет вернуть себе блокировку Продолжить работу. Когда он покинет свой synchronized-блок и отпустит объект, второй поток возобновит свою работу, и так далее. Если по какой-фПричине объект так и не будет освобожден, поток так никогда и не выйдет из метода wait(), даже если будет вызван метод notifyАІІ(). В рассмотренном примере потоки один за другим смогли возобновить свою работу.
Кроме того, определен метод wait() с параметром, который задает период тайм-аута, по истечении которого поток сам попытается возобновить СПОЮ работу. Но начать ему придется все равно с повторного получения блокировки.
Заключение
В этой лекции были рассмотрены принципы построения многопо-гочного приложения. В начале разбирались достоинства и недостатки такой архитектуры — как правило ОС не выделяет отдельный процессор под каждый процесс, а значит применяется процедура time slicing. Было выделено три признака, указывающие на целесообразность запуска нескольких потоков в рамках программы.
Основу работы с потоками в Java состовляют интерфейс Runnable и класс Thread. С их помощью можно запускать и останавливать потоки, менять их свойства, среди которых основные: приоритет и свойство daemon. Главная проблема, возникающая в таких программах - одновременный доступ нескольких потоков к одним и тем же данным, в первую очередь — к полям объектов. Для понимания, как в Java решается эта задача, был сделан краткий обзор по организации памяти в JVM, работы с переменными и блокировками. Блокировки, несмотря на название, сами по <*бе не ограничивают доступ к переменной. Программист использует их через ключевое слово synchronized, которое может быть указано в сигна-тУРе метода или в начале блока. В результате выполнение не будет продольно, пока блокировка не освободится.
Новый механизм порождает новую проблему - взаимные блокировки Weadмock), к которой программист всегда должен быть готов, тем более, 410 Java не имеет встроенных средств для опеределения такой ситуации. В ^КЦИи разбирался пример, как организовать работу программы без "зави-^Ния" ожидающих потоков.
^ В завершение рассматривались специализированные методы базово-класса Object, которые также позволяют управлять последовательное-Работы потоков.
——J[3
Вариант 1
j Каким образом на однопроцессорной машине исполняются многопоточные приложения?
_] на однопроцессорном компьютере многопоточные приложения не исполняются
(~1 количество процессоров для многопоточной архитектуры не имеет значения
("1 рабочее время процессора разбивается на небольшие интервалы, в течение которых выполняется одна задача, после чего происходит переключение на следующую задачу
2. Для чего служит в Java класс Thread?
П для запуска потоков
П для остановки потоков
П для синхронизации потоков
П для изменения свойств (например, приоритета) потоков
3. Какие из методов выбрасывают InterruptedException?
□ sleep
— wait
— notify
□ yield
Вариант 2
1. Какие преимущества дает многопоточная архитектура?
П упрощается программа, если ее алгоритм требует выполнения нескольких действий одновременно (например, обслуживание запросов)
П программа выполняется быстрее
Г~| можно более полно использовать аппаратные ресурсы для каждой задачи
П если различные задачи требуют разных аппаратных ресурсов, причем, все они могут управляться центральным процессором без перегрузки, то за счет распределенной работы суммарное время выполнения уменьшится
П за счет управления приоритетами потоков можно настроить систему так, что, выполняя меньшее количество действий, она будет совершать больше полезной работы для пользователя
П за счет управления приоритетами потоков можно добиться ускорения работы программы
Рели один поток начал исполнение synchronized-блoкa, «казав ссылку на некий объект, может ли другой поток обратиться к полю этого объекта? К методу?
Р да, да
Р да, да (если это не syпchroпized-мeтoд)
Р да, нет
Р нет, да
Р нет, да (если это не syпchroпized-мeтoд)
Р нет, нет
2. Поскольку интерфейс Runnable представляет собой альтернативный способ программирования потоков исполнения, можно ли в такой программе обойтись без класса Thread?
□ да
П да, если не модифицировать свойства потока (приоритет и т.п.)
□ нет
Вариант З
1. Что такое приоритет потока?
□ число
— количество интервалов времени, в течение которого процессор будет обслуживать поток
Г~і процессор сначала выполняет все задачи с более высоким приоритетом, затем - с менее высоким
— качественная характеристика, обеспечивающая распределение процессорного времени между потоками: чем выше приоритет тем в среднем чаще будет выделяться процессорное время для такого потока
Каким будет результат работы следующего кода? public abstract class Test implements Runnable { private Object lock = new Object();
public void lock() { synchronized (lock) { try { lock.wait();
System, out. println("1"); } catch (InterruptedException e) {
}
}
}
2. Что такое демон-поток?
□ поток, который постоянно работает и выполняет некие периодические действия
— поток, который не может существовать без обычных потоков, так как без них виртуальная машина прекращает свою работу
П поток, который автоматически останавливается виртуальной машиной, когда программа больше не нуждается в нем
public void unlock() { synchronized (lock) { lock.notify(); System.out.println("2");
}
}
public static void main(String s[]) { newThread(newTest() { public void run() { lock();
}
}.start();
new Thread(new Test() { public void run() { unlock();
}
}.start();
}
Курс Программирование^^;
П программа не завершит работу, на консоли ничего не появится
□ 1,2
□ 2,1
□ программа не завершит работу, на консоли появится 1
□ программа не завершит работу, на консоли появится 2
□ результат трудно предугадать
«ция 13 |
Пакет java.lang