Главная » Просмотр файлов » К. Арнольд, Д. Гослинг - Язык программирования Java

К. Арнольд, Д. Гослинг - Язык программирования Java (1160779), страница 38

Файл №1160779 К. Арнольд, Д. Гослинг - Язык программирования Java (К. Арнольд, Д. Гослинг - Язык программирования Java) 38 страницаК. Арнольд, Д. Гослинг - Язык программирования Java (1160779) страница 382019-09-19СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 38)

Если бы этапы 3 и 4 следовали бы в другомпорядке, то объект jareth выполнил бы hug и hugBack еще до того, как cory понадобилось бы заблокировать jareth. Однако в будущих запускахтого же приложения планировщик потоков мог бы сработать иначе, приводя к взаимной блокировке. Самое простое решение заключается в том,чтобы объявить методы hug и hugBack несинхронизированными и синхронизировать их работу по одному объекту, совместно используемомувсеми объектами Friendly. Это означает, что в любой момент времени во всех потоках может выполняться ровно один метод hug — опасностьвзаимной блокировки при этом исчезает.

Благодаря другим, более хитроумным приемам удается одновременно выполнять несколько hug безопасности взаимной блокировки.Вся ответственность в вопросе взаимной блокировки возлагается на вас. Java не умеет ни обнаруживать такую ситуацию, ни предотвращать ее.Подобные проблемы с трудом поддаются отладке, так что предотвращать их надо на стадии проектирования. В разделе “Библиография”приведен ряд полезных ссылок на книги, посвященные вопросу проектирования потоков и решению проблем блокировки.9.7.

Приостановка потоковПоток может быть приостановлен (suspended), если необходимо быть уверенным в том, что он возобновится лишь с вашего разрешения. Дляпримера допустим, что пользователь нажал кнопку C ANCEL во время выполнения длительной операции. Работу следует приостановить до тогомомента, когда пользователь подтвердит (или нет) свое решение. Фрагмент программы может выглядеть следующим образом:Thread spinner;//поток, выполняющий обработкуpublic void userHitCancel() {spinner.suspend();// приостановкаif (askYesNo("Really Cancel?"))spinner.stop();// прекращение операцииelsespinner.resume();// передумал!}Метод userHitCancel сначала вызывает suspend для потока, выполняющего операцию, чтобы остановить его вплоть до вашего распоряжения.Затем пользователь должен ответить, действительно ли он хочет отменить операцию.

Если да, то метод stop снимает поток; в противном случаеметод resume возобновляет работу потока.Приостановка ранее остановленного потока, а также возобновление работы потока, который не был приостановлен, не приводит ни к какимнежелательным последствиям.9.8. Прерывание потокаВ некоторых методах класса Thread упоминается прерывание (interrupting) потока. Соответствующие методы зарезервированы для возможности,которая вскоре будет включена в Java. На момент написания этой книги они еще не полностью реализованы; попытка их вызова приводит квозбуждению исключения NoSuchMethodError и уничтожению вызывающего потока. Вполне возможно, что к тому моменту, когда вы будетечитать эту книгу, эти методы уже будут реализованы. В данном разделе приводится их краткий обзор.Концепция “прерывания” оказывается полезной, если выполняемому потоку необходимо предоставить некоторую степень контроля надмоментом обработки события.

Например, в цикле вывода может понадобиться информация из базы данных, извлекаемая посредствомтранзакции; если при этом поступает запрос на прекращение работы, желательно дождаться нормального завершения транзакции. Потокпользовательского интерфейса может реализовать такой запрос, прерывая поток вывода и давая ему возможность дождаться конца транзакции.Подобная схема будет хорошо работать лишь в том случае, если поток вывода “хорошо себя ведет” и в конце каждой транзакции проверяет, непоступил ли запрос на прерывание (и прекращает работу в этом случае).Прерывание потока в общем случае не должно влиять на его работу, однако некоторые методы (такие, как sleep или wait) возбуждаютисключение InterruptedException. Если в вашем потоке во время прерывания выполнялся один из таких методов, то будет возбужденопрерывание Interrupted Exception.Для работы с прерываниями используются несколько методов.

Метод interrupt посылает прерывание в поток; метод isInterrupted проверяет фактпрерывания потока; статический метод interrupted проверяет, прерывался ли текущий поток.9.9. Завершение работы потокаРабота потока прекращается, когда происходит выход из его метода run. Так происходит нормальное завершение потока, но вы можетеостановить поток и по-другому.Желательно использовать самый “чистый” способ, который, однако, требует некоторой работы со стороны программиста: вместо того чтобынасильственно прекращать существование потока, лучше дать ему завершиться добровольно.

Чаще всего для этого используют логическуюпеременную, значение которой опрашивается потоком. Например:Самый прямолинейный способ завершить поток — вызвать его метод stop, который запустит объект ThreadDeath, указав ему в качестве целинужный поток. ThreadDeath является подклассом класса Error, а не Exception (объяснение того, почему так было сделано, приводится вприложении Б). Программистам не следует перехватывать ThreadDeath, если только они не должны выполнить какие-нибудь чрезвычайнонеординарные завершающие действия, с которыми не справится finally. Если уж вы перехватываете ThreadDeath, обязательно возбудите объектисключение заново, чтобы поток мог “умереть”. Если же ThreadDeath не перехватывается, то обработчик ошибок верхнего уровня простоуничтожает поток, не выводя никаких сообщений.Поток также может возбудить ThreadDeath для самого себя, чтобы завершить свою собственную работу.

Это может пригодиться, если потокуглубился на несколько уровней ниже метода run и вам не удается легко сообщить run о том, что пора заканчивать.Другой форме метода stop можно вместо ThreadDeath передать какое-то другое исключение. Хотя обычно возбуждение исключений оказываетсяне самым лучшим способом для обмена информацией между потоками, вы можете использовать эту форму общения для того, чтобы послатьпотоку какое-то сообщение. Например, если некоторый поток выполняет длительные вычисления для определенных входных значений, тоинтерфейсный поток может разрешить пользователю изменить эти значения прямо во время вычислений.

Конечно, вы можете простозавершить поток и начать новый. Тем не менее, если промежуточные результаты вычислений могут использоваться повторно, то вместозавершения потока можно создать новый тип исключения Restart Calculation и воспользоваться методом stop, чтобы запустить новое исключениев поток. При этом поток должен перехватить исключение, рассмотреть новые входные значения, по возможности сохранить результаты ивозобновить вычисления.Один поток может ожидать завершения другого потока.

Для этого применяется один из методов join. Простейшая форма этого метода ждетзавершения определенного потока:class CalcThread extends Thread {private double Result;public void run() {Result = calculate();}public double result() {return Result;}}public double calculate() {// ...}class join {public static void main(String[] args) {CalcThread calc = new CalcThread();calc.start();doSomethingElse();try {calc.join();System.out.println("result is "+ calc.result());} catch (InterruptedException e) {System.out.println("No answer: interrupted");}}}Сначала создается новый тип потока, CalcThread, выполняющий некоторые вычисления.

Мы запускаем поток, некоторое время занимаемсядругими делами, после чего пытаемся присоединиться (join) к потоку. На выходе из join можно быть уверенным, что метод CalcThread.runзавершился, а значение Result получено. Это сработает независимо от того, окончился ли поток CalcThread до doSomethingElse или нет. Когдапоток завершается, его объект никуда не исчезает, так что вы можете к нему обращаться.При вызове других форм join им передаются интервалы тайм-аута, подобные тем, какие используются для метода sleep. Имеются три формы join:public final void join() throws InterruptedExceptionОжидает безусловного завершения потока, для которого вызывается метод.public final synchronized void join(long millis) •• throws InterruptedExceptionОжидает завершения потока или истечения заданного числа миллисекунд (в зависимости от того, что произойдет раньше). Аргумент, равныйнулю, означает ожидание без тайм-аута.public final synchronized void join(long millis, int nanos) •• throws InterruptedExceptionОжидает завершения потока или тайм-аута с более точным контролем времени.

Суммарное время тайм-аута, равное 0 наносекунд, сноваозначает ожидание без тайм-аута. Количество наносекунд находится в диапазоне 0–999999.Вызов метода destroy для потока — самая решительная мера. Этот метод уничтожает поток без выполнения нормальных завершающих действий,к которым относится и снятие блокировки со всех объектов потока, так что применение destroy может навечно заблокировать другие потоки. Повозможности старайтесь избегать вызова destroy.9.10.

Завершение приложенияРабота каждого приложения начинается с запуска одного потока — того, в котором выполняется метод main. Если ваше приложение не создаетдругих потоков, то после выхода из main оно завершается. Но давайте предположим, что в приложении возникают другие потоки; чтопроизойдет с ними после выхода из main?Существует две разновидности потоков: потоки-пользователи (users) и потоки-демоны (daemons).

Наличие оставшихся потоков-пользователейприводит к продолжению работы приложения, тогда как потоки-демоны могут уничтожаться. После снятия последнего потока-пользователяпроисходит закрытие всех потоков-демонов, и работа приложения на этом заканчивается. Для пометки потока-демона применяется методsetDaemon(true), а метод get Daemon проверяет значение соответствующего флага.

По умолчанию “демонический” статус потока совпадает состатусом его потока-создателя. После того как поток начнет выполняться, изменить данное свойство невозможно; при попытке сделать этовозбуждается исключение IllegalThreadState Exception.Если новый поток порождается в методе main, то он наследует от своего создателя статус потока-пользователя. После завершения mainприложение будет выполняться до того, как завершится и этот порожденный поток. В исходном потоке нет ничего особенного — просто оноказывается первым при конкретном запуске приложения. После этого такой поток ничем не отличается от всех остальных потоков.

Характеристики

Тип файла
PDF-файл
Размер
1,1 Mb
Тип материала
Высшее учебное заведение

Список файлов книги

Свежие статьи
Популярно сейчас
Зачем заказывать выполнение своего задания, если оно уже было выполнено много много раз? Его можно просто купить или даже скачать бесплатно на СтудИзбе. Найдите нужный учебный материал у нас!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6418
Авторов
на СтудИзбе
307
Средний доход
с одного платного файла
Обучение Подробнее