Пишем свою ThreadFactory

  • 32
  • Недоступна
В классе Solution создай публичный статический класс AmigoThreadFactory, реализующий интерфейс ThreadFactory. 1. Реализация интерфейсного метода - создайте и верните трэд, который должен: 1.1. не быть демоном, 1.2. иметь нормальный приоритет, 1.3. имя трэда должно иметь шаблон "GN-pool-A-thread-B",
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (78)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
Анатолий 29 уровень
позавчера, 08:14
Для номера фабрики (что мы вставляем вместо буквы А) нужно 2 переменных: Одна static - считает количество фабрик созданных в пределах класса (количество созданных объектов класса). Вторая обычная - которая живёт в определённом объекте класса и является номером именно этого объекта. Её мы и вставим в имя нашего треда. В конструкторе созданного нами класса инкрементируете static переменную и присваиваете её значение обычной переменной, которая пойдёт в имя треда.
GBRTANK WARBOT 30 уровень, Самара
2 января, 06:07
Валидатор принял с первого раза, в тоже время нашёл следующие ошибки. 1. Сделал общий счётчик на фабрике, с помощью статического поля, в конструкторе фабрики этот счётчик увеличивал, использовал этот счётчик в установке имени треда. Но! пока я ставил имя, другой тред уже успевал поменять этот счётчик и в итоге в моём выводе был только pool-2, хотя треды принадлежали первой фабрике и должен быть pool-1. 2. Увеличивал счётчик командой getAndAdd(1), т.е использовал постинкремент, а нужен преинкремент, т.е. увеличение переменной, а потом её получение. Видимо в валидаторе это не учитывается.
Pig Man Главная свинья в Свинарнике
28 декабря 2020, 16:38
ThreadFactory (Фабрика Тредов) : Интерфейс, имеющий один метод
Thread newThread(Runnable r);
Принимает объект, реализующий интерфейс Runnable и возвращает Thread. Выглядеть это может примерно так:
class SimpleThreadFactory implements ThreadFactory {
   @Override
   public Thread newThread(Runnable r) {
     return new Thread(r);
   }
}
Либо через анонимный класс Нужно это для создания тредов с одинаковыми «настройками», так как мы можем управлять процессом создания и возвращения треда, добавив ему нужное поведение. Например, сделать поток — демоном (thread.setDaemon(true)), либо задать логику наименования новых тредов, либо выставить нужный приоритет треда (thread.setPriority(10)) и т.д. Далее остается только получить наш тред и запустить его:
SimpleThreadFactory simpleThreadFactory = new SimpleThreadFactory();
simpleThreadFactory.newThread(ourObjectRunnable).start();
alex_us 36 уровень, Симферополь
19 декабря 2020, 17:34
Проясню какая логика у решения : значит в методе мейн мы создаем две разных фабрики. внутри фабрики должна быть переменная которая считает нити для этой фабрики , но она не должна быть общей для обеих фабрик. Это важно. Кроме того должна быть общая переменная которая считает количество фабрик , но внутри отдельной фабрики должна быть своя переменная берущая значение от внешней переменной фабрик и после этого инкрементирующаяя ее)) постарался просто логическую цепочку без прямого описания решения дать)) еще и запутанное достаточно
Agent Smith 37 уровень
19 декабря 2020, 14:56
Хорошая, лёгкая задачка на повторение. Понравилось.
Davilalexius 31 уровень, Москва
12 декабря 2020, 18:57
Сделал, как написано ниже. Что примечательно: A.getAndIncrement(); //почитайте -это интересно B.incrementAndGet(); //в чем разница) Группу можно получать из самого созданного Thread в run. Все что создается нитью, в том числе и нити нашего класса, по-умолчанию получают ту же группу? И примет ли такое Валя?(это вопрос) Если да, то поле ThreadGroup group в принципе не нужно в нашем классе.
Thread tmp=new Thread(r).
String groupName=tmp.getThreadGroup().getName();
"создайте Thread с конструктором ThreadGroup, Runnable, String" -тут исправлю: конструктор без String тоже существует. Вы имя задаете отдельно setName() немного ппж)
Baxa Работает в НГМК
9 ноября 2020, 06:51
1) - для шаблона "GN-pool-A-thread-B" создайте поля в классе AmigoThreadFactory:
для GN-group.getName()-private final ThreadGroup group;
для A-poolNumber.getAndIncrement()- private static final AtomicInteger poolNumber = new AtomicInteger(1);
для B-threadNumber.getAndIncrement()-private final AtomicInteger threadNumber = new AtomicInteger(1);
2) в конструкторе проинициализируйте ThreadGroup group через Thread.текущаяНить().возьмиГруппуНити()
3) в методе newThread(Runnable r) - создайте Thread с конструктором ThreadGroup, Runnable, String
4) в конце метода перед return созданному thread.setName(GN+"-pool-"+A+"-thread-"+B);
Yulia 39 уровень
26 октября 2020, 16:20
использовала код отсюда http://wilddiary.com/understanding_custom_threadfactory_in_java/ НО аутпут каждый раз был один из 2х - либо правильный "secondGroup-pool-2-thread-2 firstGroup-pool-1-thread-1" либо неправильный "secondGroup-pool-1-thread-2 firstGroup-pool-2-thread-1". Так и не разобралась как это исправить, валидацию прошла тупо на удачу.
VitalyK #1116124 30 уровень, Рига
20 октября 2020, 13:13
чтобы pool фабрики был или 1 , или 2 static final AtomicInteger factoryCount = new AtomicInteger(1); int a = factoryCount.getAndIncrement();
Дмитрий Чесноков 31 уровень, Санкт-Петербург
11 октября 2020, 19:17
помогло клик