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

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

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

Т.е. на самом деле мы должны проверять вот так.
Если метод interruptedвозвращает «истина», то можно вызвать break. Понятно, что sleep никакой срабатывать не будет. Я его не стал убирать, вы потом поймете почему. Запускаем программу. Все ОКЕЙ, и самое главное без всяких исключений.
|
|
|
Особенности сооружения опор в сложных условиях: Сооружение ВЛ в районах с суровыми климатическими и тяжелыми геологическими условиями...
Состав сооружений: решетки и песколовки: Решетки – это первое устройство в схеме очистных сооружений. Они представляют...
Типы сооружений для обработки осадков: Септиками называются сооружения, в которых одновременно происходят осветление сточной жидкости...
Опора деревянной одностоечной и способы укрепление угловых опор: Опоры ВЛ - конструкции, предназначенные для поддерживания проводов на необходимой высоте над землей, водой...
© cyberpedia.su 2017-2026 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!