Кто первый встал - того и тапки

  • 9
  • Недоступна
1. Разберись, что делает программа. 1.1. Каждая нить должна читать с консоли слова. Используй готовый static BufferedReader reader. 1.2. Используй AtomicInteger readStringCount, чтобы посчитать, сколько слов уже считано с консоли всеми нитями. 2. Реализуй логику метода run: 2.1. Пока нить не прерва
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (120)
  • популярные
  • новые
  • старые
Для того, что бы оставить комментарий вы должны авторизоваться
ezhilo8518 уровень
18 октября, 22:47
Надеюсь дальше объяснят про ready Для тех у кого даже с использованием ready просит в конце всё равно ввести строки. Я сделал проверку на интерруптность дважды - while (!isInterrupted()){ try { if (reader.ready()&!isInterrupted()){ бла бла бла
Вагиф19 уровень, Санкт-Петербург
2 октября, 12:13
задача не простая, в помощь: ready()
Артур22 уровень, Санкт-Петербург
3 октября, 17:28
API и reader.ready() статья обязательна к прочтению. И про потокобезопасные атомарные операции обязательно стоит почитать!
Andrei Pilipuk23 уровень, Киев
17 августа, 12:49
Правильно ли я понял, что reader.ready() принципиально не решает проблему многопоточности, т.к. 1. if (reader.ready()) не "захватывает" поток reader. Это можно проверить, если вставить sleep(..) сразу после if (reader.ready()) {... В результате нужно всегда вводить еще дополнительные строки для завершения программы. 2. Если нет if (reader.ready()), то выдает две ошибки (3 и 4) "Метод run должен считывать строки из reader и добавлять их в список result" и "Метод run должен после каждого считывания увеличивать счетчик прочитанных строк countReadStrings на 1" НО ЭТИ УСЛОВИЯ ПОЛНОСТЬЮ ВЫПОЛНЯЮТСЯ!!! просто позже (также как с reader.ready()). Может правильно дополнить требования с учетом if (reader.ready())?
Eugen19 уровень
8 августа, 23:11
да долбишся и без synchronized(reader) и (reader.ready()) не проходило. помойму наворотили уж слишком ;)
Rihard198533 уровень
2 июля, 18:20
Не задачка а вынос мозга)))
while (!isInterrupted()) {//Тут проверяем остановлен ли цикл,хотя тех задании подругому написано было и терял время из за этого
    if (isInterrupted()){//Если вызвано то выходим из цикла
        break;//
    }
    synchronized (reader) {//Эту штуку у ребят отсюда посмотрел не знаю что это такое но без этого не пропускает валидатор
        String string = null;//создаем пустую строку
        try {//
            if(reader.ready()) {//Без этой проверки на считывание строк валидатор тоже не пропускал
                string = reader.readLine();//считываем сроки
                result.add(string);//заносим в лист
                countReadStrings.incrementAndGet();//вызываем добавления ,
            }//вызывал схожий метод  и тупил час
        } catch (IOException e) {//
            e.printStackTrace();//
        }


    }
}
Gagarin22 уровень, Санкт-Петербург
19 июля, 17:42
чёт слишком много всего у тебя.
if (isInterrupted())
        break;
Принимает без этого. А также без synchronized (reader). e.printStackTrace(); - тоже лишнее. Реально нужно было только reader.ready.
9 августа, 15:25
Я правильно понимаю, incrementAndGet() - это счетчик для нескольких потоков одновременно? И почему к countReadStrings нужно обращаться вот так countReadStrings.incrementAndGet() ?
Misha22 уровень
27 августа, 10:41
Павел Бобров16 уровень, Минск
6 сентября, 16:40
Можно еще проше
while (!isInterrupted()
Anastasiia20 уровень
28 июня, 23:21
а зачем это int count = Integer.parseInt(reader.readLine()); , если не используется
Boris Didenko17 уровень, Москва
5 июля, 09:42
Он используется. Ты вводишь количество строк, как ограничение на вводимые строки, которые потом будут читаться, заноситься к result, подсчитываться атомиком.
Ярослав35 уровень
8 июня, 12:36
После недолгих раздумий стало ясно, что проблема в том, что поток ввода с клавиатуры не закрывается, несмотря на interrupt и reader.close, что не удивительно для подобного кода. Что я теперь однозначно понял - стоит всегда помнить о "заплатках", типа synchronized и т.п.
Gagarin22 уровень, Санкт-Петербург
16 июля, 17:06
объясни)
Ярослав35 уровень
16 июля, 17:16
Получается три нити используют один reader, что намекает на синхронизацию для этого ридера.
Gagarin22 уровень, Санкт-Петербург
16 июля, 17:57
в нашем случае это volatile, так? П.с. вернулся после отпуска и крайне тяжело заново вникать во всё это(
Ярослав35 уровень
16 июля, 18:19
Да, но я не уверен, нужен ли volatile в этой задаче.
22 мая, 12:04
Задача так себе. Валидатор долго парил мозг, ему не хватало reader.ready(), после добавления данной проверки пропустил решение, при этом прорамма сама все равно не останавливается)) все ждет чего то чтобы ввели...
Alexey Salykin18 уровень, Москва
19 сентября, 02:30
после проверки reader.ready() нужна еще проверка на isInterrupted()
Санек Шагов21 уровень, Нижний Новгород
11 апреля, 09:59
Чет горит немного от таких заданий. Как я должен был узнать про метод ready()? Интуиция, 6-ое чувство, связь с космосом? Если про AtomicInteger countReadStrings я смог догадаться, как его инкрементировать, просто дописав через точку inc.
Кирилл Голуб22 уровень, Днепр
22 апреля, 11:37
goooooogle )) без него тут никуда. Плюс, в обязательном порядке, доп. литература. Не отчаиваемся и грызём, дальше будет только сложнее и веселее.
Андрей23 уровень, Москва
22 июня, 16:01
Ну а почему не догадаться об этом? Моя цепочка была такая: Увидел проблему, что потоки зависают на строчке с методом readline() логично ожидая когда мы им что-нибудь напишем. Ведь мы помним, что поток нельзя прервать прервать, мы можем ему только сообщить о своих намерениях. -> Значит должен быть способ, как прервать readline(), чтобы поток смог дойти до конца итерации и посмотрел на флаг isInterrupted и выйти из цикла. -> Такого способа я не смог найти, но наткнулся на метод ready(), который сообщает когда можно забирать из буфера значения, тем самым readline() не будет стоять в ожидание ввода, а моментально отработает. -> Довольный пошел за чаем и шоколадкой :) -> Написал решение -> Подумал, что не плохо бы было синхронизировать всю часть кода от ready() до инкремента, но интуиция подсказала, что валидатор примет и так -> Вуаля :)
Assanali23 уровень
19 марта, 16:38
Зря полез в комменты, надо было оставлять. и дальше читать лекции. наверно там дальше расскажут как это всё работает)
Роман Патрушев20 уровень, Казань
13 августа, 16:42
рассказали?
GraMor24 уровень
20 августа, 08:58
нет