0 / 0 / 0
Регистрация: 06.07.2023
Сообщений: 3
|
||||||
1 | ||||||
Прерывание Thread28.11.2023, 20:32. Показов 1050. Ответов 9
Метки нет (Все метки)
цикла while не выполнится и исключение не выбросится? Такое решение приподносится как верное. Число 100 установлено просто для примера что бы бросало исключение!
0
|
28.11.2023, 20:32 | |
Ответы с готовыми решениями:
9
Реагирование приложения на прерывание из IDE Проблема со Thread... Непонятки в Java. Chain method call. Thread.start() vs Thread.run() Как исправить проблему с Exception in thread "JavaFX Application Thread" java.lang.NullPointerException |
1 / 1 / 0
Регистрация: 01.03.2024
Сообщений: 16
|
||||||
19.05.2024, 17:00 | 2 | |||||
Очевидно да, такое может происходить. Это легко проверить, увеличив время выполнения код около инкремента. Например так:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 Старт! или 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 Прервано! А решение преподносится как верное из-за корректного завершения потока в любом случае, в чем и есть смысл вызова interrupt(). Если что, то мой ответ не заслуживает большого доверия, ибо сам изучаю java только пятый день. Как раз читаю многопоточность.
0
|
681 / 290 / 75
Регистрация: 07.01.2023
Сообщений: 1,209
|
|
19.05.2024, 18:08 | 3 |
interrupt() ничего не прерывает кроме методов, которые описаны через throws InterruptedException (типа sleep())
Так что описанной вами ситуации быть не может вообще
0
|
1 / 1 / 0
Регистрация: 01.03.2024
Сообщений: 16
|
|
19.05.2024, 19:29 | 4 |
Хм, я скопировал код из темы как есть. Добавил 6 строк цикла после numSeconds++;//!!!!!!!!. И получил результаты попеременно с выбросом исключения, так и без него, на каждый запуск приложения разные. Так что ситуация точно может быть. Более того, она должна быть, так как, что мешает потоку выполнять инкремент переменной, когда главный поток вызывает interrupt()? Ничего. И вы скорее всего заблуждаетесь, говоря "interrupt() ничего не прерывает кроме методов, которые описаны через throws InterruptedException ..". Вызов interrupt() точно не прерывает, он возобновляет спящий поток и тот отрабатывает исключение обычным образом. Вместе с тем interrupt() должен установить флаг "прерван" в мониторе объекта (в данном случае clock). На этот флаг реагирует Thread.currentThread().isInterrupted() и поток завершается без получения исключения. Думаю вызов interrupt() должен 1) установить флаг для объекта и 2) возобновить выполнение потока, ассоциированного с объектом. Не важно спит поток или выполняется. Просто делает системный ОС вызов "возобновить".
0
|
681 / 290 / 75
Регистрация: 07.01.2023
Сообщений: 1,209
|
||||||
20.05.2024, 07:11 | 5 | |||||
mavapo,
Потому что код написан криво. Перепишите на
0
|
1 / 1 / 0
Регистрация: 01.03.2024
Сообщений: 16
|
||||||
20.05.2024, 08:55 | 6 | |||||
Переписал. Все то же самое.
Старт! 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Завершено на 17 или Старт! 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 Прервано! Завершено на 18 Только не просите убрать добавленный вызов метода с циклом. Я не собираюсь запускать программку 10 миллионов раз, чтобы выловить однократное срабатывание условия завершения потока через флаг завершения(Thread.currentThread().isInterrupted()).
0
|
681 / 290 / 75
Регистрация: 07.01.2023
Сообщений: 1,209
|
|
20.05.2024, 13:17 | 7 |
И чем это вас удивляет? Первый раз interrupt() сработал, выставил флаг isInterrupted, вы его в условии while перехватили и завершили поток. Сообщения "прервано" нет.
Второй раз inetrrupt() был вызыан во время sleep, возбудил исключение, флаг isInterrupted не устанавливался, и мы свалили из потока по исключению. (сообщение "Прервано"). Так что все просто понятно и логично. Каких вы чудес ждете?
0
|
1 / 1 / 0
Регистрация: 01.03.2024
Сообщений: 16
|
||||||
20.05.2024, 14:35 | 8 | |||||
0
|
1 / 1 / 0
Регистрация: 01.03.2024
Сообщений: 16
|
|
20.05.2024, 16:30 | 10 |
Ха, ну давайте документацией померяемся
Вот например выдержка из https://docs.oracle.com/javase... rrupt.html В той ссылке, что вы предложили описывается то же самое, т.е. поведение к которому приведет вызов interrupt(). А не то, что этот вызов делает внутри своего кода. Примерно так: "..затем статус прерывания будет очищен и они (функции sleep() и т.д.) получат InterruptedException". Нужно смотреть реализацию в исходном коде на самом деле, чтобы узнать точно кто что делает. Это может быть не очень просто. Моя версия мне нравится больше. А именно: interrupt() устанавливает флаг и возобновляет спящий поток, а sleep() выбрасывает исключение (если есть основания) и очищает флаг (если условие исключения случилось). Это логично и легко реализуемо.
0
|
20.05.2024, 16:30 | |
20.05.2024, 16:30 | |
Помогаю со студенческими работами здесь
10
Exception in thread "JavaFX Application Thread" java.lang.NullPointerException при создании Label Jogl ошибка: Exception in thread "Thread-0" java.lang.UnsatisfiedLinkError: Can't load library: /Users/maga/IdeaProjects Ошибка Exception in thread "JavaFX Application Thread" java.lang.NullPointerException Почему когда фоновый thread "спит" я не могу убить main thread ? Ошибка Exception in thread "JavaFX Application Thread" java.lang.NullPointerException Exception in thread "JavaFX Application Thread" java.lang.NullPointerException при создании новой Tab или окна Exception in thread "Thread-4,9,11,12,13" java.lang.IllegalMonitorStateException Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |