Список и нити

  • 9
  • Недоступна
Множим нити снова и снова. В методе main добавьте в статический объект list пять нитей. Каждая нить должна быть новым объектом класса Thread, работающим со своим объектом класса SpecialThread. Метод run класса SpecialThread должен выводить "it's a run method inside SpecialThread".
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (84)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
Roman16 уровень
6 часов назад
list.add(new Thread(new SpecialThread()));
NewBuy16 уровень, Санкт-Петербург
вторник, 16:55
5 попыток из-за конченого условия. Спасибо комментариям, так бы наверное не решил...
Alexandr Volchkov16 уровень, Киев
15 марта, 13:00
Задача на тренировку индусского стиля написания кода: Много строчек - хорошо! Подсказка: Не вешайте циклы а просто напишите 5 строчек создавая объекты и 5 строчек добавляя их в список.
Rif17 уровень
10 января, 00:09
Требований по запуску потоков не было, так что можно и так
for (int i = 1; i <= 5; i++) list.add(new Thread(new SpecialThread()));
MrBronz22 уровень
1 января, 21:06
Так же попался на том, что валидатор ругается при запуске нитей на "Каждая нить из списка list должна работать со своим объектом класса SpecialThread." Но ведь это условие выполняется независимо от того, запускаешь нити или нет?
Rif17 уровень
10 января, 00:13
Это требование означает всего лишь
list.add(new Thread(new SpecialThread()));
Требований по запуску не было
MrBronz22 уровень
14 января, 15:51
О том и речь. У меня в коде в точности такая строка. Но валидатор выдал "Каждая нить из списка list должна работать со своим объектом класса SpecialThread." И пропустил задачу после того, как я убрал запуск нитей (ничего более не меняя, просто закомментировал цикл с запуском), о чем прочитал в комментариях ниже, т.к. многие столкнулись с таким неочевидным поведением валидатора, который придирается к тому, к чему требований не было.
Даша22 уровень, Харьков
23 ноября 2018, 12:13
2го марта была найдена двусмысленность(а появилась она еще раньше))) - и в ноябре до сих пор формулировка задачи остается той же "Алексей Горяйнов20 уровень, Москва 2 марта, 13:35 Короче снова двусмысленность в задании, если следовать 5 пункту требований, то логично запустить нити. (Метод run класса SpecialThread должен выводить "it's a run method inside SpecialThread".) и тогда валидатор отказывается принимать задание, если же нити не запускать, решение проходит"
Vitaly Khan35 уровень
24 ноября 2018, 04:57
да, можно понять и так, и так... например, я сразу понял, как задумывали авторы, т.к. нигде не фигурирует, что потоки надо запускать.
IceBerg30 уровень, Днепр
26 декабря 2018, 16:12
Двусмысленности никакой нет, есть четкое требование - "метод должен выводить" и ни единого слова о запуске метода/нити. Но инстинктивно запустить хочется, это да)
Tat19 уровень
24 сентября 2018, 06:26
определение переменной с ключевым словом volatile(«изменчивый») означает, что значение переменной будет изменяться разными потоками. Чтобы полностью понять, что значит volatile, во-первых, нужно понять, как потоки оперируют с обычными, не-volatile, переменными. В целях повышения эффективности работы, спецификации языка Java позволяет JRE сохранять локальную копию переменной в каждом потоке, который ссылается на нее. Можно считать эти «внутрипоточные» копии переменных похожими на кэш, помогающий избежать проверки главной памяти каждый раз, когда требуется доступ к значению переменной. Но представьте, что произойдёт в следующем случае: запустятся два потока, и первый прочитает переменную А как 5, тогда как второй – как 10. Если переменная А изменились от 5 до 10, то первый поток не будет знать об изменении, так что будет иметь неправильное значение А. Однако если переменная А будет помечена как volatile, то то в любое время, когда поток обращается к её значению, он будет получать копию А и считывать её текущее значение. Если переменные в вашем приложении не меняются, то внутрипоточный кэш имеет смысл. В противном случае, очень полезно знать, что может сделать для вас ключевое слово volatile.
Vitaly Khan35 уровень
24 ноября 2018, 04:43
из чего можно сделать вывод, что в данной задаче volatile не имеет смысла. ведь к переменной есть обращение только из одного потока (main).
Вагиф24 уровень, Санкт-Петербург
18 сентября 2018, 12:23
Решил чуть по другому , а потом улучшил, только вот не знаю пропустит волидатор или нет, попробуйте:
for (int i = 0; i < 5; i++){
            list.add(new Thread(new SpecialThread()));
            new Thread(new SpecialThread()).run();
        }
Gatis17 уровень
19 декабря 2018, 01:09
Tvoi variant neproshol... moi prohodit.
Rif17 уровень
10 января, 00:11
Требований по запуску потока нет, так что можно оставить только add()
for (int i = 1; i <= 5; i++) list.add(new Thread(new SpecialThread()));
Shamil20 уровень
29 января, 12:39
Это не верный код, создаются всего 10 разных объектов 5 в массив и 5 просто запускаются вот верный (только не для текущей задачи, а для исправления кода выше, думаю волидатор не пустит)
for (int i = 0; i < 5; i++){
            list.add(new Thread(new SpecialThread()));
            list.get(i).run();
        }
Lex24 уровень, Москва
14 августа 2018, 16:30
SpecialThread[] arr = new SpecialThread[list.size()]; Thread[] att = new Thread[list.size()]; for(int i = 0;i < list.size();i++){ arr[i] = new SpecialThread(); att[i] = new Thread(arr[i]); list.add(att[i]); } по сути тоже самое,но видимо компилятор проверяет на наличие некоторого текста и бракует по его отсутствию. Не проходит. Придется расписывать.
Lex24 уровень, Москва
14 августа 2018, 16:34
SpecialThread s1 = new SpecialThread(); Thread t1 = new Thread(s1); SpecialThread s2 = new SpecialThread(); Thread t2 = new Thread(s2); SpecialThread s3 = new SpecialThread(); Thread t3 = new Thread(s3); SpecialThread s4 = new SpecialThread(); Thread t4 = new Thread(s4); SpecialThread s5 = new SpecialThread(); Thread t5 = new Thread(s5); list.add(t1); list.add(t2); list.add(t3); list.add(t4); list.add(t5); расписал вот так и прошло.
WildDisk22 уровень, Владивосток
15 августа 2018, 07:12
ух ё... чёт ты сильно усложнил... не знаю, на какой текст, тест должен ругаться, но скорее проблема в list.size. init capacity внутри ArrayList'a это не размер списка, а потенциально вмещённое количество элементов. На момент отработки твоего цикла твой list.size по сути равен ничему, а соответственно лист и не заполняется. Скорее всего если бы ты ниже просто вывел список на экран, то догадался бы
Lex24 уровень, Москва
16 августа 2018, 13:02
да вы правы.моя ошибка.
Rif17 уровень
10 января, 00:18
Ого какой изврат. А ведь решение в одну строку
for (int i = 1; i <= 5; i++) list.add(new Thread(new SpecialThread()));
Максим27 уровень
12 августа 2018, 20:23
Вот, глядь! Всё попробовал: List<Thread> list = new ArrayList<>, List<Runnable> list = new ArrayList<>, List<SpecialThread> list = new ArrayList<> с запуском и без запуска во всех комбинациях - валидатор не принимает. Поднимаю глаза выше метода main и вижу там: public static volatile List<Thread> list = new ArrayList<Thread>(5); Я чуть со стула не упал! Оказывается, всё это время переопределял в методе main список, не видя, что он уже есть в классе Solution. В итоге - программа работает, валидатор ругает меня, я его... :)
Boris23 уровень
13 сентября 2018, 13:49
а эта фраза тебя не смутило???
В методе main добавить в статический объект list 5 нитей.
у тебя же не статические все 3 инициализаций :)) я тоже изначально думал как делать сразу в Маин статический список и пока дочитал условие вспомнил что может быть инициализация сразу в класе Solution и это уже 4 или 5 подвох такого типа :)) уже нужно читать что такое Volatile
Nataliya Masliy23 уровень, Львов
18 сентября 2018, 13:30
Спасибо) Затупила на том же)