воскресенье, 17 марта 2013 г.

Прерывание потока. Для чего нужен Thread.currentThread().interrupt()

Часто можно встретить код, вроде такого:

try {
    Thread.sleep(1000);
} catch (InterruptedException e) {
    //Восстанавливаем статус прерывания потока
    Thread.currentThread().interrupt();
}

Если не понимать логику работы прерываний, то напрашивается вопрос: для чего поток прерывает сам себя? На самом деле, выражение "прерывание потока" не очень удачное. Для этого есть устаревший(deprecated) и небезопасный метод stop, которым не рекомендуется пользоваться. Сам разработчик потока должен думать о корректном завершении работы своего потока.

Вызов метода потока interrupt просто устанавливает флаг, означающий, что код, использующий этот поток, хочет его прервать. Поток может узнать об этом желании вызовом isInterrupted, и решить, что ему делать дальше.

Часто хорошим решением в этой ситуации является генерация исключения InterruptedException. Посмотрим, например, на поведение Thread.sleep() – приостанавливает поведение потока, но проверяет флаг, и как только замечает, что он установлен, бросает InterruptedException.

Но разве недостаточно в catch-секции просто завершить работу потока? Это не очень хорошее решение, так как обработка исключения может происходить где-то глубоко на низком уровне, а поток  должен совершить какую-нибудь работу перед завершением. А генерация исключения сбрасывает флаг, поэтому более высокоуровневые методы могут никогда не узнать о том, что поток был прерван, а следовательно и корректно завершить работу.

В следующем примере поток успешно поспит 2 раза, но третий сон будет прерван. Метод sleep2sec узнает об этом, но утаит эту информацию. Поэтому, поток будет выполнятся бесконечно, несмотря на проверку isInterrupted().

public class CatLife{
    
    final public static void main(String[]args) throws InterruptedException{
        Thread cat = new Thread(new Cat());
        cat.start();
        Thread.sleep(5000);
        cat.interrupt();
        cat.join();
    } 
    
    static class Cat implements Runnable{

        @Override
        public void run() {
            while(!Thread.currentThread().isInterrupted()){
                System.out.println("Сон начинается");
                sleep2sec();
                System.out.println("Сон закончился\n");
            }
            System.out.println("Завершение работы потока");
        }
        
        private void sleep2sec(){
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                System.out.println("Сон прерван");
            }
        }
        
    }

}

Тут есть 2 решения:
1. Пробросить исключение.
2. Снова установить флаг прерывания: Thread.currentThread().interrupt() в catch-секции, чтобы условие цикла выполнилось.

14 комментариев:

  1. Любопытная статья. Только почему то незаконченная. Хотелось бы ещё увидеть примеры кода с решениями.

    ОтветитьУдалить
  2. зачем в этом примере вызывать cat.join();

    ОтветитьУдалить
    Ответы
    1. Поток который вызывает cat.join(); ждет пока поток cat завершится. В данном примере если убрать большой разницы не будет.

      Удалить
  3. Ответы
    1. static class Cat implements Runnable{}
      из за implements Runnable{} ...
      в нем есть метод public void run(); пожтаму нжно его реализовать

      Удалить
    2. static class Cat implements Runnable{}
      из за implements Runnable{} ...
      в нем есть метод public void run(); пожтаму нжно его реализовать

      Удалить
  4. Просто и понятно

    ОтветитьУдалить
  5. "для чего поток прерывает сам себя?"
    Насколько я понял - это основной вопрос, на который должна ответить статья. Но Он получился какой то завуалированный.

    По мне, ответ в том, что вызывая Thread.sleep мы вынуждены написать код реагирования на checked InterruptedException. Обработка обязательна - иначе поток не завершится. По-этому нужно либо пробросить его дальше, а это значит навязать всем пользователям нашего метода самим обрабатывать эту ситуацию, что дико ухудшает код. Или более нормальный способ - поймав исключения, самим прервать себя, выставив флаг в состояние прерывания через Thread.currentThread().interrupt().

    Т.е. природа первого куска кода - это то, что Thread.sleep бросает checked исключение.

    ОтветитьУдалить
  6. Я порекомендую всем, кто ищет кредит для бизнеса в Le_Meridian, они помогли мне с кредитом в четыре миллиона долларов для запуска моего квилтингового бизнеса, и это было быстро. Когда я получил от них кредит, было удивительно, насколько легко им было работать. Они могут финансировать до $ 900 000 000 000 (Девятьсот миллионов долларов) в любом регионе мира, если на проектах можно гарантировать рентабельность инвестиций в 1,9%. Процесс был быстрым и безопасным. Это был определенно положительный опыт. Избегайте мошенников и свяжитесь с Le_Meridian Funding Service On. info@lemeridianfds.com WhatsApp ... + 19893943740. Если вы ищете кредит для бизнеса, спасибо.
    Лесли,

    ОтветитьУдалить
  7. VarangaOfficial - варанга цена украина - все, что нужно знать об этом препарате. Воспользовавшись нашим сайтом, вы получите возможность узнать обстоятельную информацию касающуюся представленного средства. Увидеть данные о клиническом тестировании геля, прочитать реальные отзывы пациентов и медицинского персонала. Ознакомиться с инструкцией по применению, прочесть особенности и методы работы комплекса, уяснить, в чем заключаются особенности работы крема Варанга, где необходимо заказывать сертифицированный, оригинальный препарат и, как не нарваться на фальсифицированный товар. Мы очень тщательно и скурпулезно проверяем размещаемые данные. Предоставляем посетителям нашего онлайн-ресурса сведения, взятые только из подлинных источников. Если вы обнаружили признаки развития грибка или же долго и безрезультатно стараетесь излечиться от этого неприятного недуга, у нас на сайте вы найдете простой и быстрый способ устранения проблемы. Присоединяетесь и живите здоровой полноценной жизнью. Все, что вы хотели знать, теперь можно найти на одном ресурсе.

    ОтветитьУдалить
  8. Порно пары дают партнерам рунетки зрелые Сейчас. Приходите на рунетки пары, чтобы понаблюдать и принять участие. Быстрый секс чат, в котором пары онлайн реализуют все потребности подписчиков. Порно чат с парами разнообразит семейную жизнь! Секс по веб-камере! Номер 1 в европе - эротический видеочат для сторонников эротики и порно общения. Там нет порнографии или откровенного содержания интимного содержания. Наша платформа предлагает подход к древесному топливу, информации. Пары (74) парни (53) бесплатный видеочат и виртуальные истории для взрослых, что ни этот онлайн-портал, ни его партнерские порталы не будут нести ответственность за все юридические последствия. Бонго видео чат онлайн с девушками по всей земле. Толпы горячих моделей и интимных парней ждут партнеров для вирта в комнатах, чтобы использовать веб-камеру для реализации эротической мечты, для достижения совместного. Эротические онлайн-кинотеатры: пары занимаются сексом перед веб-камерой! Бесплатный эрочат с исполнителями народов мира! Заходите и знакомьтесь прямо сейчас! Популярный видеочат с женатыми парами онлайн. На сайте bongacams каждый желающий может познакомиться с семейными парами и посмотреть их секс.

    ОтветитьУдалить
  9. Вы не выиграли квартальный приз или забыли о дне рождения своей племянницы, но денег нет? Для того, чтобы срочно занять займ без паспорта, Вам необходимо взять в качестве партнера любое отделение банкомата. Однако заранее человеку необходимо будет узнать о выдаче срочных кредитов. Чтобы получить быстрый микрозайм, вам нужно всего лишь иметь на руках паспорт. Игрокам не нужны сертификаты определенной платежеспособности или информация об имуществе. Вы будете в курсе опции в течение одного часа, к тому же для этого до 30 000 рублей - довольно короткий срок. Присмотритесь повнимательнее к нашим акциям: вам наверняка понравится кредит от трех 000 рублей до 30 тысяч рублей. Без комиссии. У игроков есть 2 простых варианта оставить заявку на срочный микрозайм до дня выплаты зарплаты: * в соседнем отделении банкомата. Адреса микрозаймов расположены в 37 регионах нашей страны; * не выходя из квартиры. Для этого вам нужно заполнить простую анкету на портале и нажать кнопку "отправить". Специалист разработает договор и проинформирует вас о погашении кредита до дня выплаты жалованья. Получить деньги при отсутствии справки о доходах и гарантий еще никогда не было так просто!

    ОтветитьУдалить
  10. Еще на 1500 лет. По количеству типографий лейпциг занимал лидирующие позиции во всей бельгии и франции. Автостоянка "эдельвейс" - это круглогодичное помещение для лечения младенцев в возрасте от семи до более чем пятнадцати столетий. Помню, в том случае я решил впервые посмотреть на байкал, посмотрел цены на авиалайнер до иркутска, а также улан-удэ, или в рим было значительно дешевле. Из нашего города - исключительно до иркутска. До площади три километра, в случае до самых интересных мест (водохранилища) всего 38 метров. Удобное расположение в городе - одно из преимуществ отеля. Длина реки составляет что-то около восьми километров, но глубина составит пять метров. В заливе есть два небольших острова: безымянный и тойнак. Кроме того, а также малыши и не только могут охотно прокатиться в зоопарк на скромных трейлерах, курсирующих по специально отведенной территории. Из интересных впечатлений от лейпцига стоит отметить собор святого учителя фомы (thomaskirche), построенный 15 ноября. На готическом ключе, ну, всемирно популярная группа мальчиков, которой в течение 25 лет руководил иоганн себастьян бах. Внимание иностранцев привлечет тот факт, что здесь находится храм священного псевдо-учителя, выполненный в готическом жанре. Ольхон) займет три-четыре дня. Утес волшебницы (или мыс бурхан) расположен на острове ольхон. Обратите внимание, что во время вашего отпуска у вас есть возможность осмотреть не более чем памятники культуры. В том случае, когда вы разумно оцениваете свой карман и поэтому не всегда можете покупать дорогие поездки, но в то же время защищаете свою семью от реальных несоответствий в новой стране, тогда помогите ему стать максимально информативным, все, что вам помогает большинство умелых экспертов-спелеологов. Активные участники народов планеты отправляются в это место - великолепные соединения программ с близкими реками, байдарками, дайвингом, велосипедными направлениями, восхождениями на высотные вершины, джипингом, ездой на квадроциклах в случае снегоходов, лыжными трассами гарантируют вам зажигательную энергию освоения сибирской природы. Но если вы хотите взглянуть на дорогу в картах и тоже нажать на ту, которая вам нравится, это означает, что люди переходят на страницу с указаниями к любым историческим местам байкала. Великолепие других памятных мест, особенно природных, расположено вокруг озера байкал. Выехать намеренно за 5000 километров до озера байкал в компьютере тоже пока не предусмотрено. Из таких населенных пунктов можно добраться до байкала. Номера в гостиницах и гостиницах хотят продавать голосом еще долго, до прихода теплого сезона. Проектирование начинается за много времени до самого путешествия. В случае, если вам понравилась эта короткая публикация, что ж, вы определенно хотите изучить конкретную информацию о байкал путевки цены Мы ждем вас на персональном новостном ресурсе.

    ОтветитьУдалить
  11. Не так давно индустрия обнаружила, что пользуется особым преимуществом - печатью на перфорированной пленке. Этот материал является дополнительным дизайнерским напольным покрытием, которое также может быть изобретательно использовано в компаниях внутренней и внешней рекламы. Найдите рекламный коммерческий продукт на нашем сайте вашего уровня дохода. Hydra onion - крупнейшая компания, работающая в типографии "аллапринт". Наши сотрудники уделяют самое пристальное внимание качеству, продолжительности выполнения заявок в течение длительного времени, в случае быстрой доставки. Модные инструменты в загородном парке и с возможностью высококвалифицированных рабочих помогут не только быстро сделать полноцветную печать на перфорированной пленке, но и предоставить доступные цены. Печать на перфорированной пленке: основные характеристики Перед началом выпуска необходимо уложить перфорированную оболочку в предварительно подготовленную основу. Он используется для того, чтобы краска находилась на холсте. По окончании высыхания изделия подложку снимают с плоскости. В итоге полученная фотография будет яркой и ослепительной, несмотря на наличие отверстий в перфорированной пленке. Далее - ламинирование. Рисунок ламинирован средствами, чтобы пыль еще не проникла в отверстия, честность товара. Преимущества нашей типографии Типография allaprint часто хочет развивать производственные возможности, не всегда отдавая предпочтение достижениям. Предлагаемые специалисты проходят циклы повышения квалификации, выставочные мероприятия и многое другое. Многовековое сотрудничество с потребителями позволяет каждому из нас поддерживать нормальные цены на продукцию в перфорированной пленке. Обратившись сюда, вы будете рады, благодаря тому, что наша компания гарантирует: - Деятельность ценных специалистов с богатым опытом; - мгновенное выполнение запроса; - исключительное качество продукции; - получение всесторонней поддержки; - использование инновационных строительных расходных материалов; а также инновационных устройств; - гибкая тактика и стратегия затрат. Штампы по доступной цене в перфорированной пленке; - возможность разыграть собственный дизайн-заготовки; - перевозка полиграфической продукции в каждый населенный пункт штата. Купив у нас в типографии самую подробную печать на перфорированной пленке по хорошей цене в российской федерации, вы сможете наклеивать собственные объявления на полки универмагов, доставляя лекарства, но, помимо прочего, на фасады домов и лестничные клетки. Наша компания расположена в бауманском районе столицы нашей родины. Но проще сразу подать заявку, связавшись с действующими менеджерами, набрав нашего менеджера, который зарегистрирован на страницах сайта. Для того, чтобы узнать больше о посещениях баннер недорого Цветочного портала.

    ОтветитьУдалить