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

  • 9
  • Недоступна
1. Разберись, что делает программа. 1.1. Каждая нить должна читать с консоли слова. Используй готовый static BufferedReader reader. 1.2. Используй AtomicInteger readStringCount, чтобы посчитать, сколько слов уже считано с консоли всеми нитями. 2. Реализуй логику метода run: 2.1. Пока нить не прерва
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (130)
  • популярные
  • новые
  • старые
Для того, что бы оставить комментарий вы должны авторизоваться
Андрей17 уровень, Москва
воскресенье, 23:40
Хреновая задача. Про reader.ready() непонятно откуда нужно было догадаться.
Erik Ghukasyan18 уровень
суббота, 11:51
Оказывается надо каждый раз проверять готов ли следующий символ в буффере. if(reader.ready())
Azat Nurgaliev17 уровень
11 января, 22:45
Суть задачи отражает название: "Кто первый встал - того и тапки". Только вместо тапок у нас поток reader, и какая нить первой захватит его, та и считывает. Задача поделить поток ввода между тремя нитями. Как мне кажется, логичная точка старта рассуждений. P.S. Только до этой логичной точки старта рассуждений я догадался, когда все комментарии прочёл :D
Дмитрий23 уровень
18 декабря 2018, 15:41
Да, совет: пункт
4. Метод run должен после каждого считывания увеличивать счетчик прочитанных строк readStringCount на 1.
нужно воспринимать буквально и реализовывать этот самый инкремент !сразу! после чтения строки
Pavlic Morozov (pashok09i)20 уровень, Екатеринбург
8 декабря 2018, 18:38
я считаю, что можно было бы и сделать подсказку в какую сторону копать, а не просто не принимать 3 и 4 пункт без reader.ready(). Не понимаю как до этого можно было додуматься, кто знает? Хотя и без этого все работало верно. С reader.ready() вылетело java.io.IOException: Stream closed однако валидатор схавал ¯ \ _ (ツ) _ / ¯
ezhilo8522 уровень
18 октября 2018, 22:47
Надеюсь дальше объяснят про ready Для тех у кого даже с использованием ready просит в конце всё равно ввести строки. Я сделал проверку на интерруптность дважды - while (!isInterrupted()){ try { if (reader.ready()&!isInterrupted()){ бла бла бла
Vitaly Khan35 уровень
27 ноября 2018, 10:45
я попробовал так, все равно лишний ввод иногда требует. а вот синхронизация по объекту reader, похоже, решает проблему.
Вагиф22 уровень, Санкт-Петербург
2 октября 2018, 12:13
задача не простая, в помощь: ready()
Артур22 уровень, Санкт-Петербург
3 октября 2018, 17:28
API и reader.ready() статья обязательна к прочтению. И про потокобезопасные атомарные операции обязательно стоит почитать!
Andrei Pilipuk25 уровень, Киев
17 августа 2018, 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())?
Constantine20 уровень
12 января, 01:40
Полагаю, что "return;" в main решает проблему. Это догадка, я не в полной мере уверен. Когда есть return, то все созданные потоки закрываются даже если они не успели кайфануть от вирутальной жизни в полной мере. Предположение основано на том, что аналогичная проблема с введением дополнительных строк ушла после постановки "return".
Eugen19 уровень
8 августа 2018, 23:11
да долбишся и без synchronized(reader) и (reader.ready()) не проходило. помойму наворотили уж слишком ;)
Rihard198533 уровень
2 июля 2018, 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();//
        }


    }
}
Gagarin28 уровень, Санкт-Петербург
19 июля 2018, 17:42
чёт слишком много всего у тебя.
if (isInterrupted())
        break;
Принимает без этого. А также без synchronized (reader). e.printStackTrace(); - тоже лишнее. Реально нужно было только reader.ready.
9 августа 2018, 15:25
Я правильно понимаю, incrementAndGet() - это счетчик для нескольких потоков одновременно? И почему к countReadStrings нужно обращаться вот так countReadStrings.incrementAndGet() ?
Misha22 уровень
27 августа 2018, 10:41
Павел Бобров16 уровень, Минск
6 сентября 2018, 16:40
Можно еще проше
while (!isInterrupted()
11 января, 21:16
В данном случае при использовании синхронизации все строки запишутся в 1-ый объект, т.к. возьмет на себя приоритет по reader. Можно использовать метод isDaemon() для потока, перед его стартом, он говорит о том что поток не приоритетный и при завершении потока main все остальные потоки убиваются