Снова interrupt

  • 9
  • Недоступна
Создай нить TestThread. В методе main создай экземпляр нити, запусти, а потом прерви ее используя метод interrupt().
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (26)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
S3R3N1TY33 уровень, Санкт-Петербург
25 января, 12:13
Задача чтобы задуматься, а действительно ли метод interrupt() останавливает поток ? Интересный момент и код для изучения http://javaforcats.blogspot.com/2013/03/threadcurrentthreadinterrupt.html
fedor18 уровень, Москва
12 апреля, 11:44
не останавливает. а только спускает в код метода run() сигнал с просьбой закругляться. этот сигнал возбуждает внутри run() исключение как минимум в методе .sleep() и, будучи отловленным try{} catch{}, сбрасывает этот сигнал обратно на дефолтное значение (=false) - т.е. как будто и не было послано сигнала об остановке. так что корректная обработка такого сигнала от .interrupt() - на плечах разработчика
Gatis19 уровень
1 января, 18:49
Почему нету - ...подумай что делает программа? :)
Anonymous #37410529 уровень, Амстердам
5 ноября 2018, 19:04
Довольно таки интересная задача, не смотря на простоту. Она напоминает, что недостаточно для прерывании нити вызвать на ней interrupt(). Нить должна прервать себя сама реализовав функцию прерывания при вызове этого метода. Из уроков oracle: An interrupt is an indication to a thread that it should stop what it is doing and do something else. It's up to the programmer to decide exactly how a thread responds to an interrupt, but it is very common for the thread to terminate. ... For the interrupt mechanism to work correctly, the interrupted thread must support its own interruption.
Сергей33 уровень
9 августа 2018, 12:11
Сделал в методе: public static void ourInterruptMethod() { new InterruptedException();} и в Run условие: while (!Thread.currentThread().isInterrupted()) Валидатор не принимает. В чем тут проблема? Пока писал понял, что эксепшн то в главной нити генерится а не во второстепенной.
JackHuman Entertainment20 уровень
11 июля 2018, 10:09
То бишь без проверок и без sleep прерывание тоже сработает? Почему? Или он прервался ещё до того, как мы его прервали?
Beslan Bavizhev39 уровень
6 сентября 2018, 16:57
Потому что закончилось выполнение метода run().
Vaiki18 уровень, Минск
16 января 2018, 21:20
public static void main(String[] args) throws InterruptedException {
        TestThread test = new TestThread();
        test.start();
        Thread.sleep(100);// ПОЧЕМУ ЕСЛИ УБРАТЬ ЭТУ СТРОЧКУ КОД НЕ РАБОТАЕТ?
        // НАДО СТАВИТЬ ГЛАВНУЮ НИТЬ НА ПАУЗУ ЧТОБЫ JM ПОСМОТРЕЛ(ИНИЦИАЛИЗИРОВАЛ ДОЧЕРНЮЮ НИТЬ)
        // А ПОТОМ ПРОДОЖИЛ МАНИПУЛЯЦИИ ЧЕРЕЗ ГЛАВНЫЙ ПОТОК? Я ПРАВИЛЬНО ПОНЯЛ?
        test.interrupt();}
    public static class TestThread extends Thread{
        @Override
        public void run() {
            try{while (!interrupted()){
                Thread.sleep(2000);
            }}catch (InterruptedException e){
                System.out.println("Stop thread");
            }
        }
19 января 2018, 01:56
что то я не понимаю, зачем ты main и run спать отправлял? в условии этого нет, или вопрос о другом. Амиго, дай пояснения;)
Vaiki18 уровень, Минск
25 января 2018, 18:16
run спать отправлял для того чтобы вызвать исключение в нити с помощью interrupt, которое выдаст сообщение, что нить остановлена... вопрос: почему не выдает сообщение, если main в сон не отправить?
Vaiki18 уровень, Минск
25 января 2018, 18:30
пока тебе отвечал, понял почему так))) из-за того что !interrupted не вызывает исключения и просто останавливает, если бы в while написал что другое, то уже сработал бы блок catch... есть такая фраза: моя кошка все знает, пока я ей объясняю вопрос, я нахожу ответ)))
Beslan Bavizhev39 уровень
27 января 2018, 21:14
Слишком много лишнего. Просили два действия: запустить и прервать.
Артем28 уровень, Минск
30 апреля 2018, 12:32
А я понял твою ошибку) Исключение вызывается тогда выполняются два условия: 1) когда переменная isInterrupt станет true (при вызове interrupt() она становится true) 2) когда в run() вызовется метод sleep(). Именно при вызове сна проверяется переменная isInterrupt. Проблема твоего кода в том, что interrupt вызывается раньше, чем успевает начаться цикл. Как итог - условие цикла не выполняется и сон в методе run для вызова исключения никогда не вызывается Чтобы код работал, как ты хочешь, в main надо до вызова интеррапта сделать ЛЮБОЕ ДЕЙСТВИЕ. Например, вывести на экран текст. Это задержит код и все будет выполняться. Проверено
weber7518 уровень
15 января 2018, 03:00
Сделал быстро но валидатор не пропускал, вместо строчки "xxx.start();" написал "xxx.run():" Действие по факту одинаковое, может кто объяснить различие?
Илья22 уровень, Москва
18 января 2018, 10:17
разница огромна, в лекциях было, при xxx.start(); поток запускается параллельно основному потоку (main), при xxx.run(); основной поток остановится до тех пор пока не прервется xxx. Создание и запуск новых потоков в самом конце
weber7518 уровень
19 января 2018, 00:57
Спасибо! Действительно невнимательность моя.
Gagarin28 уровень, Санкт-Петербург
19 июля 2018, 11:18
А разве это не удобнее когда нам надо дождаться окончания нити? Можно не использовать метод join(), а просто запускать нить с помощью run() ?
Дмитрий18 уровень, Санкт-Петербург
29 августа 2018, 20:00
Когда запущена новая нить, мы можем продолжать выполнять операции, и, при необходимости, ждать завершения запущенной нити. Если просто вызвать метод run(), мы будем ждать завершения его работы, а могли бы использовать это время с умом.
Александр18 уровень, Киев
7 декабря 2017, 02:33
После задачи про гонки, мне кажется, что это какой-то изощренный вид издевательства)
kruvvtor40 уровень, Москва
12 октября 2017, 14:08
Это для поднятия самооценки)))
NazFarr29 уровень
5 октября 2017, 10:17
из этой главы первый раз решаю задачу самостоятельно )((((((