Вопрос: Ну что скажете по поводу такого кода? — КиберПедия 

Археология об основании Рима: Новые раскопки проясняют и такой острый дискуссионный вопрос, как дата самого возникновения Рима...

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

Вопрос: Ну что скажете по поводу такого кода?

2022-10-10 38
Вопрос: Ну что скажете по поводу такого кода? 0.00 из 5.00 0 оценок
Заказать работу

Ответ: Ужасный код! Представьте, что я делаю математику и хочу, чтобы interruptработал. Вдруг я зациклюсь. И мне говорят, ты паузы делай. А нормально нельзя написать программу? Кстати, вы не должны забывать с чего вы начали сегодняшнее занятие. Зачем вы делаете потоки, чтобы не было блокировок и ожиданий. В общем это выглядит странно. Понятно, что мы не все до конца знаем.

Вообще можно в лоб решить задачу. Я могу сделать в своем классе MyThread1 поле. Назвать его «Меня хотят остановить». Присвоить этому полю изначально по умолчанию false. Если это поле будет Booleanто falseему присвоится автоматом. Я могу это поле сделать public, а если не хотите нарушать инкапсуляцию то сделаете сетер. И тогда любой, кто с вашим потоком извне работает, он возьмет и ваш флажок переключит в другое состояние. А вы что тогда сделать? На каждой итерации его проверять. Вы все время проверяете «А не хотят ли меня остановить?». Икаждуюитерациюсмотрите «О! Хотят!». Нуесливасхотятостановить, точтовысделаете? Сохраните все данные в БД, чтобы не произошла потеря данных и нормально культурно завершите работу. Я этого делать не буду подробно, потому что такой флажок уже предусмотрен в классе Thread. Когда вы вызываете interruptон уже выставляет этот флажок, поэтому нам создавать свой собственный не нужно, но нужно знать, как правильно создается такой флажок. Нужно знать синтаксис. Вдруг вам в какой-то другой ситуации придется некоторое подобное поле делать? И там есть волшебное ключевое слово, которое мы не разбирали на прошлом курсе. Покакойпричине? Безпотоковихнепоймешь. Итак, я буду делать поле публичным.

Главное, что это поле инициализируется false. Его могут переключить в true. Так вот такое объявление некорректно, с т.з. многопоточного программирования. И проблема связана с тем, что может получиться так, что ваш поток прочитает данные. Вы вообще слышали, что у процессора могут быть кэши разных уровней, если у вас потоки выполняются, то это не значит, что каждый раз когда происходит обращение к переменной, ее значение берется из основной памяти. Она может браться из кэша для оптимизации производительности работы процессора. Поэтому здесь может быть другая ситуация. Кто-то переключил это поле. А у вас значение этого поля isStop хранится в кэше. И вы каждый раз когда флажок будете проверять оно будет браться из кэша, а то, что в основной памяти значение поменялось вы не в курсе, и ваша программа работать не будет. Есть специальное слово, которое говорит «пожалуйста, бери значение этого поля из основной памяти», вот и все.

Вот надо объявлять поле, чтобы мы могли два потока переключать и между собой это значение перекидывать и смотреть. Но есть такое поле уже – поле interrupted. И наша задача на самом деле не создавать поля и лишний функционал, а пользоваться тем, что есть. И если открыть справку, то мы увидим, что данный метод проверяет «а не был ли текущий поток прерван извне?». По сути это проверяет некий флажок, и если вам скажут true, то значит кто-то для вашего потока вызвал этот interrupt.

Т.е. на самом деле мы должны проверять вот так.

Если метод interruptedвозвращает «истина», то можно вызвать break. Понятно, что sleep никакой срабатывать не будет. Я его не стал убирать, вы потом поймете почему. Запускаем программу. Все ОКЕЙ, и самое главное без всяких исключений.


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

Семя – орган полового размножения и расселения растений: наружи у семян имеется плотный покров – кожура...

Особенности сооружения опор в сложных условиях: Сооружение ВЛ в районах с суровыми климатическими и тяжелыми геологическими условиями...

Кормораздатчик мобильный электрифицированный: схема и процесс работы устройства...

Двойное оплодотворение у цветковых растений: Оплодотворение - это процесс слияния мужской и женской половых клеток с образованием зиготы...



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

0.009 с.