Археология об основании Рима: Новые раскопки проясняют и такой острый дискуссионный вопрос, как дата самого возникновения Рима...
Состав сооружений: решетки и песколовки: Решетки – это первое устройство в схеме очистных сооружений. Они представляют...
Топ:
Когда производится ограждение поезда, остановившегося на перегоне: Во всех случаях немедленно должно быть ограждено место препятствия для движения поездов на смежном пути двухпутного...
Установка замедленного коксования: Чем выше температура и ниже давление, тем место разрыва углеродной цепи всё больше смещается к её концу и значительно возрастает...
Интересное:
Подходы к решению темы фильма: Существует три основных типа исторического фильма, имеющих между собой много общего...
Мероприятия для защиты от морозного пучения грунтов: Инженерная защита от морозного (криогенного) пучения грунтов необходима для легких малоэтажных зданий и других сооружений...
Как мы говорим и как мы слушаем: общение можно сравнить с огромным зонтиком, под которым скрыто все...
Дисциплины:
2022-10-10 | 38 |
5.00
из
|
Заказать работу |
|
|
Ответ: Ужасный код! Представьте, что я делаю математику и хочу, чтобы interruptработал. Вдруг я зациклюсь. И мне говорят, ты паузы делай. А нормально нельзя написать программу? Кстати, вы не должны забывать с чего вы начали сегодняшнее занятие. Зачем вы делаете потоки, чтобы не было блокировок и ожиданий. В общем это выглядит странно. Понятно, что мы не все до конца знаем.
Вообще можно в лоб решить задачу. Я могу сделать в своем классе MyThread1 поле. Назвать его «Меня хотят остановить». Присвоить этому полю изначально по умолчанию false. Если это поле будет Booleanто falseему присвоится автоматом. Я могу это поле сделать public, а если не хотите нарушать инкапсуляцию то сделаете сетер. И тогда любой, кто с вашим потоком извне работает, он возьмет и ваш флажок переключит в другое состояние. А вы что тогда сделать? На каждой итерации его проверять. Вы все время проверяете «А не хотят ли меня остановить?». Икаждуюитерациюсмотрите «О! Хотят!». Нуесливасхотятостановить, точтовысделаете? Сохраните все данные в БД, чтобы не произошла потеря данных и нормально культурно завершите работу. Я этого делать не буду подробно, потому что такой флажок уже предусмотрен в классе Thread. Когда вы вызываете interruptон уже выставляет этот флажок, поэтому нам создавать свой собственный не нужно, но нужно знать, как правильно создается такой флажок. Нужно знать синтаксис. Вдруг вам в какой-то другой ситуации придется некоторое подобное поле делать? И там есть волшебное ключевое слово, которое мы не разбирали на прошлом курсе. Покакойпричине? Безпотоковихнепоймешь. Итак, я буду делать поле публичным.
Главное, что это поле инициализируется false. Его могут переключить в true. Так вот такое объявление некорректно, с т.з. многопоточного программирования. И проблема связана с тем, что может получиться так, что ваш поток прочитает данные. Вы вообще слышали, что у процессора могут быть кэши разных уровней, если у вас потоки выполняются, то это не значит, что каждый раз когда происходит обращение к переменной, ее значение берется из основной памяти. Она может браться из кэша для оптимизации производительности работы процессора. Поэтому здесь может быть другая ситуация. Кто-то переключил это поле. А у вас значение этого поля isStop хранится в кэше. И вы каждый раз когда флажок будете проверять оно будет браться из кэша, а то, что в основной памяти значение поменялось вы не в курсе, и ваша программа работать не будет. Есть специальное слово, которое говорит «пожалуйста, бери значение этого поля из основной памяти», вот и все.
|
Вот надо объявлять поле, чтобы мы могли два потока переключать и между собой это значение перекидывать и смотреть. Но есть такое поле уже – поле interrupted. И наша задача на самом деле не создавать поля и лишний функционал, а пользоваться тем, что есть. И если открыть справку, то мы увидим, что данный метод проверяет «а не был ли текущий поток прерван извне?». По сути это проверяет некий флажок, и если вам скажут true, то значит кто-то для вашего потока вызвал этот interrupt.
Т.е. на самом деле мы должны проверять вот так.
Если метод interruptedвозвращает «истина», то можно вызвать break. Понятно, что sleep никакой срабатывать не будет. Я его не стал убирать, вы потом поймете почему. Запускаем программу. Все ОКЕЙ, и самое главное без всяких исключений.
|
|
Семя – орган полового размножения и расселения растений: наружи у семян имеется плотный покров – кожура...
Особенности сооружения опор в сложных условиях: Сооружение ВЛ в районах с суровыми климатическими и тяжелыми геологическими условиями...
Кормораздатчик мобильный электрифицированный: схема и процесс работы устройства...
Двойное оплодотворение у цветковых растений: Оплодотворение - это процесс слияния мужской и женской половых клеток с образованием зиготы...
© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!