Написал код, для того чтобы поиграться - разобраться .
логика была такая .
В Main запускаю myThread на время 2T.
А через время T из Main прерываю myThread.
https://onlinegdb.com/B1GSC9iAD
НО НАТКНУЛСЯ на непонятные вещи.
Вопервых обнаружил очень интересную специфику работы interrupt() и isInterrupted()
строки с 25-40 и 53-60
Как будто после вызова метода interrupt() состояние isInterrupted() меняется на какой то промежуток с False на True а потом опять на False.
Где можно почитать , или есть хорошее доступное объяснение ?
Во вторых - без BREAK в 57 строке получаем бесконечный цикл! Тоже не понял почему!?
Hardy
32 уровень
Игрался с Tread join() и inteapted()
Решен
Комментарии (6)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Стас Пасинков Software Developer в Zipy Master
12 января 2021, 23:41решение
почитать можно будет в лекциях когда будете проходить многопоточность.
также можно почитать в документации про само исключение.
а еще почитать про единственный метод у вас в коде, который это исключение кидает - sleep(). там же найдете ответ и на вопрос почему он вообще кидает это исключение
если коротко: если вызов метода interrupt() произошел тогда, когда тред "спал" - то возникнет выушеуказанное исключение, но само значение внутреннего флага не изменится, и метод isInterrupted() будет все-равно возвращать false.
если тред был прерван в процессе своей работы, а не пока он "спал" - то все отработает как надо, значение флага изменится, метод isInterrupted() будет возвращать true как вы и ожидаете.
но поскольку у вас нет каких-то "длительных" операций в цикле (в классе TestThread, конечно же. зачем вам другие циклы - я не особо понял), и тред то засыпает, то просыпается - то в каких-то случаях вы будете прерывать его пока он спит, а в каких-то других случаях - пока он работает. такова природа многопоточности, что сложно четко предсказать поведение треда :)
+2
Стас Пасинков Software Developer в Zipy Master
12 января 2021, 23:42полезный
по этой же причине и не работает без брейка (в случаях когда тред прервали пока он спал)
+1
Стас Пасинков Software Developer в Zipy Master
12 января 2021, 23:44полезный
ааа, я смотрю у вас вообще нет никаких операций в цикле, и ваш тред, по-сути, постоянно "спит". поэтому вы и видите только ситуацию, когда этот тред прерывается во время сна
+1
Hardy
13 января 2021, 07:03
Большое спасибо за содержательный ответ!
ТО что хотел услышать!
0
Стас Пасинков Software Developer в Zipy Master
13 января 2021, 08:24
пожалуйста. но все-равно рекомендую почитать об этом)
0
Hardy
13 января 2021, 08:47
Обязательно!
0