Вопрос: Чем принципиально interrupt отличается от stop? — КиберПедия 

Организация стока поверхностных вод: Наибольшее количество влаги на земном шаре испаряется с поверхности морей и океанов (88‰)...

Состав сооружений: решетки и песколовки: Решетки – это первое устройство в схеме очистных сооружений. Они представляют...

Вопрос: Чем принципиально interrupt отличается от stop?

2022-10-10 53
Вопрос: Чем принципиально interrupt отличается от stop? 0.00 из 5.00 0 оценок
Заказать работу

Ответ: Тем, что stopпоток просто завершает, а interruptв нем поднимает исключение и вы попадаете в том потоке в блок try, из tryпопадаете в catchи в finally. Поэтому вы обязательно обработаете исключение InterruptExceptionи соответственно в своем блоке вы можете предпринять все меры по сохранению данных.

Да, interruptпоток завершает, но есть одно «но».

Если поток блокирован или находится в ожидании или спит, то тогда interruptподнимает исключение.

А вот наш поток, который считал до 499 – он был блокирован? Нет. Онспал? Нет. Онвызывалjoin? Нет. Значитнанегоinterruptнедействует. Онработаетипашет. interruptвыбиваетизожидания. Ондляэтогоисделан. Поток в бесконечном ожидании ресурса, и мы его пинком оттуда вышибаем с помощью exceptionи он завершает свою работу. А если он пашет, даже в бесконечном цикле, то interruptна него не действует. Но он же работает, старается – нет. Конечно, можно сделать чтобы действовал, но это должны вы, как программисты написать правильный код, потому что если вы пишете неправильный код, то даже самая замечательная идея будет уничтожена. Поэтому чтобы interruptвоздействовал на любой поток, который находится в любом состоянии, то это мы должны сделать – написать правильный код. Мы это сделаем.

Итак, мы переходим к вопросу: А как мне получить пример с работающим interrupt? Потому что пока мы видели, что он вроде как и есть, но и как бы эффекта тоже нет. Но чтобы эффект появился, нам нужно, чтобы поток, который мы хотим остановить с помощью interrupt, чтобы он находился в состоянии wait, joinи sleep.

· вариант с wait: Сwaitпокасложно (это пройдем во второй части занятия).waitсвязан с синхронизацией.

· вариант с join: ну кого ему ждать? он другие потоки не запускал. ждать ему некого.

· единственный для нас разумный способ – это в этом потоке MyThread1 написать sleep.

Поэтому открываем класс MyThread1, видим метод run. Здесь нет блока, поэтому поставьте фигурные скобочки после forи закройте ее. В цикле вы пишете Thread.sleep(1). Учтите, что sleepявляется статическим методом и его можно вызывать только для себя. Я не могу другому потоку сказать «спи», только для себя. Обратите внимание, я написал sleep и видите мне предлагают обработку exception? Давайте вспомним язык Java. Мне предлагают обрабатывать исключение. Могу я написать вариант throws? Я пишу throws, документирую его тем самым и не буду обрабатывать. Могу я так сделать? Давайте попробуем.

И как только вы это сделали, ваша программа перестает работать.

Дело в том, что конструкция – это, конечно, хорошо, но проблема с ней следующая: эта конструкция является частью сигнатуры метода. И если полиморфный метод (а мы полиморфный метод вообще-то переопределяем), или если вы переопределяете метод из интерфейса, если в его сигнатуре нет throws, то вы не можете его добавить, потому что вы меняете сигнатуру. И поэтому метод run, который объявлен в библиотеке или в интерфейсе - он без throws, то вы не можете добавить и это будет уже другой метод. Поэтому то, что нас сейчас красным подчеркнули, нам говорят «дружок, может быть все-таки runбудем переопределять?». Это можно, конечно, засчитать, на это не будет переопределением метода. Поэтому я этот вариант закомментирую.

Обратите внимание, если в интерфейсе вы открываете объявление метода и там не написано throws, то вы не можете этого делать. А если там написано, ну ради бога. Кстати, если там написано, то вы можете не писать, вы можете делать только жестче. Если их метод (его сигнатура) не выбрасывает никаких исключений, значит ваш не выбрасывает. Если их не выбрасывает 5, то вы можете сделать, что будет выбрасывать 3. Вы можете уменьшить количество выбрасываемых throwsисключений. Но если его нет, то появиться он не может.

Итак, что мы сделали? Для того чтобы заработал interruptмы искусственно добавили в наш код «сон», но пришлось уж, как последствие, поставить блок try-catch. Будеттеперьработатьinterrupt? Да, дело в том, что как только поток оказался в состоянии блокировки ожидания или сна, вот тут-то на него и действует interrupt.А в Main уже заготовка имеется. Посмотрите, как мы поступили. Как только был создан объект и стартован мы тут же с помощью interruptпредупреждаем виртуальную машину – «как только поток mtзаснет, ты дай ему сразу исключение».

run: end of main Name = Thread-0, i = 0 Name = Thread-1, i = 0 Name = Thread-1, i = 1 Name = Thread-1, i = 2 Name = Thread-1, i = 3 Name = Thread-1, i = 4 СБОРКА УСПЕШНО ЗАВЕРШЕНА (общее время: 0 секунд) Вот нулевой поток делает одну итерацию и в конце sleep и сразу идет исключение. первый поток конечно нормально отработал.

 


Поделиться с друзьями:

Индивидуальные очистные сооружения: К классу индивидуальных очистных сооружений относят сооружения, пропускная способность которых...

Наброски и зарисовки растений, плодов, цветов: Освоить конструктивное построение структуры дерева через зарисовки отдельных деревьев, группы деревьев...

История создания датчика движения: Первый прибор для обнаружения движения был изобретен немецким физиком Генрихом Герцем...

Архитектура электронного правительства: Единая архитектура – это методологический подход при создании системы управления государства, который строится...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.007 с.