кто сможет прояснить задачу 1628? После вывода всех троих списков идет строчка reader.close(). Если в методе run() не использовать if(reader.ready()) то в консоли после вывода значений списков все равно будет моргать курсор, как бы приглашая ввести еще что-то. Если 2-3 раза нажать клавишу enter выпадет исключение java.io.IOException: Stream closed. Почему появляется исключение?
Anun@k
22 уровень
почему появляется исключение?
Решен
Комментарии (7)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Anun@k
12 ноября 2017, 10:25
Теперь вот в чем вопрос. Если получаем исключение - мол хотим использовать поток когда он закрыт, то я не понимаю почему программа вообще к нему обращается, ведь у нас последней строчкой в main() идет закрытие буфера reader.close();.
0
Pavlo Plynko Java-разработчик в CodeGym Expert
13 ноября 2017, 12:29
Обращение идет из других потоков, "параллельных", и для них имеет смысл последняя строчка метода run(), а не main().
0
Anun@k
13 ноября 2017, 15:07
Но у нас же 3 строчки consolReader.interrupt(); чтобы прервать эти потоки. Плюс, если посмотреть в код, то в условии цикла
while (!this.isInterrupted()) вообще будет false и тело цикла не выполнится, а значит и не будет попытки обращения к буферу. Делая выводы - в main() буфер уже закрыт, но в каком-то из параллельных потоков команда на прерывание consolReader.interrupt() еще не была исполнена. Я правильно понял?
0
Pavlo Plynko Java-разработчик в CodeGym Expert
13 ноября 2017, 15:33
У нас есть четыре потока: один основной и три ReaderThread.
Возможная последовательность выполнения команд:
- строка 14 в основном потоке
- строка 35 в consolReader1
- строки 37 в consolReader1 запросила ввод с консоли
- строка 15 в основном потоке
- строка 35 в consolReader2
- строки 37 в consolReader2 запросила ввод с консоли
- строка 16 в основном потоке
- строка 35 в consolReader3
- строки 37 в consolReader3 запросила ввод с консоли
- строка 18 в основном потоке крутится цикл
- ты ввел число с клавиатуры, в consolReader1 выполнились строки 37 и 38
- в consolReader1 пошла следующая итерация цикла: строка 35, строка 37 запросила ввод с консоли
- строка 18 в основном потоке все еще крутится цикл
- ты ввел число с клавиатуры, в consolReader2 выполнились строки 37 и 38
- в consolReader2 пошла следующая итерация цикла: строка 35, строка 37 запросила ввод с консоли
- строка 18 в основном потоке все еще крутится цикл
- ты ввел число с клавиатуры, в consolReader3 выполнились строки 37 и 38
- в consolReader3 пошла следующая итерация цикла: строка 35, строка 37 запросила ввод с консоли
- в основном потоке выходим из цикла, выполняются строки 21-28, поток завершился
- если ввести с клавиатуры число - consolReader1 получает его, выполняет строки 37, 38, выполняет проверку в 35 и завершается.
- а если ввел не число - в consolReader1 в 37 строке вылетает исключение, печатается стэктрейс в блоке catch и поток завершается.
- последние два пункта повторяются для consolReader2 и consolReader3.
0
Anun@k
12 ноября 2017, 10:22
вот вывод:
3
ee
rr
tt
#1:[ee]
#2:[rr]
#3:[tt]
java.io.IOException: Stream closed
...
at com.javarush.task.task16.task1628.Solution$ReaderThread.run(Solution.java:50)
Process finished with
0
Pavlo Plynko Java-разработчик в CodeGym Expert
13 ноября 2017, 12:27
Представь, что в потоке consolReader1 выполнилась строка 37, затем 38, и успела начаться следующая итерация цикла, до того как отработала строка 21, таким образом снова запросился ввод с клавиатуры. И так в каждом из трех потоков. Пока ты ввел данные второй раз, reader уже закрыли.
+2
Сергеев ВикторMaster
12 ноября 2017, 02:31
покажите код и исключение, иначе получите какой-то общий ответ
Например :
java.io.IOException: Stream closed. выскакивает т.к. вы закрыли поток и попытались воспользоваться им
0