• ,

level16.lesson13.bonus02

Народ, помогите! Я че-т уже все перепробовал. Не понимаю, что не так

package com.javarush.test.level16.lesson13.bonus02;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

/* Клубок
1. Создай 5 различных своих нитей c отличным от Thread типом:
1.1. нить 1 должна бесконечно выполняться;
1.2. нить 2 должна выводить "InterruptedException" при возникновении исключения InterruptedException;
1.3. нить 3 должна каждые полсекунды выводить "Ура";
1.4. нить 4 должна реализовать интерфейс Message, при вызове метода showWarning нить должна останавливаться;
1.5. нить 5 должна читать с консоли цифры пока не введено слово "N", а потом вывести в консоль сумму введенных цифр.
2. В статическом блоке добавь свои нити в List<Thread> threads в перечисленном порядке.
3. Нити не должны стартовать автоматически.
Подсказка: Нить 4 можно проверить методом isAlive()
*/

public class Solution {
    public static List<Thread> threads = new ArrayList<Thread>(5);

    static {
        threads.add(new Thread1());
        threads.add(new Thread2());
        threads.add(new Thread3());
        threads.add(new Thread4());
        threads.add(new Thread5());

    }

    public static class Thread1 extends Thread {

        @Override
        public void run() {
            while(true) {}
        }
    }


    public static class Thread2 extends Thread  {

        @Override
        public void run() {
            try {
                Thread.sleep(Integer.MAX_VALUE);
            } catch (InterruptedException e) {
                System.out.println("InterruptedException");
            }
        }
    }


    public static class Thread3 extends Thread {

        @Override
        public void run() {
            try {
                while(!Thread.interrupted()) {
                    System.out.println("Ура");
                    Thread.sleep(500);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        }
    }


    public static class Thread4 extends Thread  implements Message {

        @Override
        public void run() {

            while(!Thread.interrupted()) {}
        }

        @Override
        public void showWarning() {
            if (this.isAlive()) {
                this.interrupt();
            }
        }
    }


    public static class Thread5 extends Thread {
        private BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        private int counter;

        @Override
        public void run() {
            String line;
            try {
                while(true) {
                    line = reader.readLine();
                    if (line.equals("N")) {
                        break;
                    }
                    counter += Integer.parseInt(line);
                    reader.close();
                }
                System.out.println(counter);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}


1.1. нить 1 должна бесконечно выполняться;
Выполняется

1.2. нить 2 должна выводить «InterruptedException» при возникновении исключения InterruptedException;
Нить ждет в слипе, пока не будет прервана, потом выводит строку в консоль

1.3. нить 3 должна каждые полсекунды выводить «Ура»;
Каждые полсекунды выводится «Ура»

1.4. нить 4 должна реализовать интерфейс Message, при вызове метода showWarning нить должна останавливаться;
Интерфейс реализован. Нить выполняется пока мы не прервем эту нить.
В некоторых решениях я видел this.join(), но прямо говоря, я не понимаю, зачем здесь join(), да и на прохождение задачи эта запись не влияет

1.5. нить 5 должна читать с консоли цифры пока не введено слово «N», а потом вывести в консоль сумму введенных цифр.
Читает. Считает. Выводит

19 комментариев

Alena
  • Alena
  • 0
  • Комментарий отредактирован 2017-02-03 19:13:05 пользователем Alena
Если я не ошибаюсь, то тут проблема была в методе isInterrupted(). Именно этот метод надо использовать в двух местах. И в методе showWarning() я не ставила проверку, а просто прерывала
zor07
  • zor07
  • 0
  • Комментарий отредактирован 2017-02-04 22:01:32 пользователем zor07
Все не проверял. Первая мысль которая пришла в голову: «Создай 5 различных своих нитей c отличным от Thread типом», — все твои нити наследуются от Thread.
К примеру, в коде ниже выведется true.
<code>
public class Main {
    public static void main(String[] args) {
        System.out.println(new B() instanceof A);
    }
}
class A{}
class B extends A {}
</code>

Хотя твой код может и не поэтому не приниматься )
HAGer
Ну как бы намек на имплементирование Runnable, но тут есть одно но. У Runnable нет метода isAlive
Подсказка: Нить 4 можно проверить методом isAlive()
HAGer
  • HAGer
  • 0
  • Комментарий отредактирован 2017-02-06 10:19:18 пользователем HAGer
Я-таки попробовал все классы перевести на Runnable, добавив Thread.currentThread():
<code>
    if (Thread.currentThread().isAlive()) {
        Thread.currentThread().interrupt();
    }
</code>
Все равно не проходит тестирование
HAGer
Так. Нашел одну ошибку
В 5 трэде reader.close(); надо было вынести за пределы цикла. Пока строки двигал туда-сюда не заметил, что передвинул дальше, чем нужно
Но все равно не проходит проверку
Xottabich81
  • Xottabich81
  • 0
  • Комментарий отредактирован 2017-02-08 13:05:28 пользователем Xottabich81
Попробуйте в майне стартануть поток 5
public static void main(String[] args) {
threads.get(4).start();
}
HAGer
Попробовал. Ветка стартанула. Начал вводить цифры, потом ввел «N». Ветка остановилась.
ввод: 2
ввод: 3
ввод: 5
ввод: N
вывод: 10
Xottabich81
выполнилось условие задачи: 1.5. нить 5 должна читать с консоли цифры пока не введено слово «N», а потом вывести в консоль сумму введенных цифр.
Тест пройден?
HAGer
Ну да. А что, я что-то не так понимаю? Ввод и вывод я привел в предыдущем сообщении
Xottabich81
  • Xottabich81
  • 0
  • Комментарий отредактирован 2017-02-08 14:22:44 пользователем Xottabich81
static {
threads.add(new Thread1());
threads.add(new Thread2());
threads.add(new Thread3());
threads.add(new Thread4());
threads.add(new Thread5());

} здесь нити создаются, но не стартуются
т.е. поток создался и сразу умер, а как же ему вывести что то на экран если он не стартанул

1.5. нить 5 должна читать с консоли цифры пока не введено слово «N», а потом вывести в консоль сумму введенных цифр.
Читает. Считает. Выводит

это реализация, а кто ее выполняет?
HAGer
Ну так нигде не написано, что эти нити надо запускать. Написано только то, что они должны делать
Xottabich81
понять что хотят в условии задачи помогает обновленный Джава Раш — нужен только премиум аккаунт, при проверке задания зелеными и красными отметками помечается что выполнено, что нет
HAGer
о как
меня обновленный JavaRush пока не пускает в мой профиль :-((
Xottabich81
может в саппорт написать
а так я купил премиум — и не жалею, много нервов экономит ))
не приходится стучатся в стену. ИДЕ работает как надо а тест не проходит )))
HAGer
Видать система кусками начинает работать. В итоге я залогинился. Плагин к идее до сих пор не пашет
HAGer
  • HAGer
  • 0
  • Комментарий отредактирован 2017-02-08 15:19:31 пользователем HAGer
Новый JavaRush показал ошибку в 5 нити
Программа не предусматривала обработку введения произвольных строк и падала. Я её переписал.
На локальном компе выполняется без проблем. При проверке вываливается сообщение, что программа выполняется слишком долго… чудеса какие-то
<code>
        @Override
        public void run() {
            String line = "";
            int number = 0;
            while (true) {
                try {
                    line = reader.readLine();
                    if (line.equals("N")) {
                        reader.close();
                        break;
                    }
                    number = Integer.parseInt(line);
                } catch (Exception e) {
                    continue;
                }
                counter += number;
            }
            System.out.println(counter);
        }
</code>

И, да. Все остальные нити не нуждались в старте, чтобы быть правильными. Я подозреваю, что и 5-я нить тоже в этом не нуждается
HAGer
В итоге решил. В пятой нити мне пришлось перенести создание BufferedReader и counter внутрь run
А с четвертой нитью вышло вообще непонятно что. Сначала она принималась. как есть, потом не принималась… в итоге я только её сделал extends Thread implements Message и потом использовал try-catch блок с interupt и join… и вот этот последний пункт вообще ни разу не понятен, т.к. во-первых, написано, что нити должны быть отличны от Thread типом… во-вторых, нить спокойно прерывалась будучи implements Runnable
maximuswork
Вот я тоже не понял почему так. Как только определения BufferedReader и summ перенес внутрь run, принялась 5 нить. А когда за пределами run не принимается. Почему так?
maximuswork
А 4 нить сделал без isAlive() и валидатор принял решение. Сделал через еще одну переменную.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.