public static class ReaderThread extends Thread {
private List<String> result = new ArrayList<String>();
String line;
public void run() {
try { while (!isInterrupted()) {
line=reader.readLine();
result.add(line);
readStringCount.getAndIncrement();
System.out.println(readStringCount.get());
System.out.println(isInterrupted());
Thread.sleep(100);
}
} catch (IOException e) {
System.out.println("Исключение: IOException "+ getName());
} catch (InterruptedException e) {
System.out.println("Исключение: InterruptedException "+ getName());
return;
}
System.out.println("После цикла:"+readStringCount.get());
System.out.println(isInterrupted());
}
Эксперимент показал, что interrupt никак не влияет на цикл внутри нити.
Я вводил число 5(количество считываний)
Вводил 5 строк, после чего был выведен правильный результат.
Но программа не завершилась на этом - приходилось вводить еще четыре строки.
Только после этого цикл завершался, в результате того, что поток был закрыт в main и возникало IOException.
Разъясните пожалуйста эту коллизию, будьте добры!Даниил
22 уровень
Не понимаю, почему не действует интеррапт!?
Решен
Комментарии (18)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Ksenia Volkova Java Developer в DXC Master
5 января 2020, 16:57решение
А где у тебя interrupt, который должен действовать?
И еще вроде нужна проверка reader.ready() - он же один на все нити
+2
Даниил
5 января 2020, 17:08
ААА!!! Теперь все стало ясно!
А я почему-то думал, что интеррапт там есть, вот же невнимательный какой, а?
Спасибо еще раз!
А что за reader.ready(), вроде про нее же ничего не говорили?!
0
Ksenia Volkova Java Developer в DXC Master
5 января 2020, 17:24решение
Смотри, у тебя все нити будут доходить до reader.readLine() и ждать, пока не будет введена строка. Когда ты введешь строку, одна из нитей ее получит, а остальные продолжат ждать.
Потом ты введешь еще одну строку, одна из нитей ее получат, остальные ждут - и так далее.
Когда после очередного считывания сработает
(count > countReadStrings.get())
у тебя все еще будут нити, ждущие в очереди на считывание строки внутри своего цикла while. И пока они не считают свои строки, не будет проверки isinterrupted и программа не сможет завершиться.
Как-то так...
+3
Даниил
5 января 2020, 17:37
Я поставил проверку на reader.ready(), и у меня программа вошла в бесконечный цикл.
Получается reader никогда не готов?
0
Ksenia Volkova Java Developer в DXC Master
5 января 2020, 18:15
Там нет бесконечного цикла, вводи строки - и все будет работать.
reader не готов, пока ты ничего не ввел.
Просто из-за того, что ты println и sleep оставил вне if, пока нитям нечего считывать - они все равно выводят эти println каждую секунду.
0
Даниил
5 января 2020, 18:38
Да, так программа работает верно!
Правда не понял почему....
0
Даниил
5 января 2020, 18:45
А можно обратить Ваше внимание на очень интересную и таинственную для меня тему?:
https://javarush.com/help/33548
0
Ksenia Volkova Java Developer в DXC Master
5 января 2020, 18:55
Если не понял, почему работает, лучше покопайся внимательнее и разберись.
А если интересна тема с UncaughtExceptionHandler - то можно погуглить и много чего найти.
Тут, например - http://javatutor.net/articles/catching-uncaught-exceptions
И у Шилдта наверняка это есть.
0
Даниил
5 января 2020, 19:02
ААА я понял почему так происходит!
Я просто не успевал ввести строку и управление переходило к следующему println !
Насчет UncaughtExceptionHandler - то я что-то в инете ничего толкового не нашел(на русском языке).
а Шилдт - это какая книжка конкретно?
А еще у меня есть вопрос почему запрещено обращаться к нестатическому методу\переменной из статического контекста?
0
Ksenia Volkova Java Developer в DXC Master
5 января 2020, 19:18решение
Шилдт Java: Полное руководство - один из лучших справочников по Java
Статический контекст не требует создания объекта класса, статические методы и переменные могут существовать (выполняться) без экземпляров класса вообще.
Нестатические же, наоборот, привязаны к конкретному экземпляру класса и без него существовать не могут.
В этом и ограничение - ты не можешь использовать нестатический метод, не создав сначала объект.
+3
Даниил
5 января 2020, 19:21
Очень интересно!
А как можно пользоваться классами, не создавая объектов?
0
Ksenia Volkova Java Developer в DXC Master
5 января 2020, 19:34полезный
Когда ты пишешь, например, Integer.parseInt("...") - ты пользуешься методом класса Integer.
При этом объекта Integer ты не создавал.
+1
Даниил
5 января 2020, 19:38
У Шилдса всего две строчки об этом, где бы еще узнать?...
0
Даниил
8 января 2020, 18:34
До меня все равно не доходит почему мы не можем обратиться к нестатическому объекту из статического контекста.
Ну можем мы вызывать методы класса не создав объекта, ну и что из этого?
0
Ksenia Volkova Java Developer в DXC Master
8 января 2020, 19:47
Да не в том дело, что мы можем вызывать статические методы без объекта, а в том, что нестатические мы так вызывать не можем. Потому что нестатическим членам класса - полям и методам - обязательно нужна ссылка на объект. Без нее они не работают.
Например, возьмем какой-нибудь метод, пусть будет обычный геттер:
Когда мы будем вызывать этот метод, как он узнает, поле name какого именно объекта он должен вернуть?
Очень просто - метод сам нестатический, он будет вызван у какого-то конкретного объекта, и таким образом будет иметь в себе ссылку на этот объект. И когда ему понадобится поле name, он будет знать, у какого объекта этот name искать.
А теперь попробуем добавить в наш класс статический метод и обратиться из него к нестатической переменной
Если бы могли написать и вызвать такой метод, что бы он должен был напечатать? name какого объекта? 0
ГоффMaster
3 января 2020, 12:10
А попробуй, если не сложно, вставить целиком задачу. Здесь не видно, куда ты число 5 вводил, как там прерывание даётся, да и какой у задачи номер тоже здесь не видно.
0
Даниил
4 января 2020, 13:17
https://javarush.com/tasks/com.javarush.task.task16.task1628
Сначала вводится число - сколько строк должно быть считано.
Затем три нити наперебой считывают строки, и задача должна завершиться, когда нужное количество строк введено но не завершается..
Задача "Кто первым встал того и тапки" 0
Даниил
4 января 2020, 13:18
0