Ниво 28. Отговори на интервюта по въпроси по темата за нивото

Отговорът на този въпрос е в лекциите на CodeGym.

За да оптимизира паралелната работа на нишките, Java има способността да задава приоритети на нишките. Нишките с по-висок приоритет имат предимството да спечелят време на процесора пред нишките с по-нисък приоритет.

Приоритетната обработка се осигурява от следните методи от класа Thread:

публичен окончателен void setPriority (int newPriority)

Задава приоритета на нишка.

публичен окончателен int getPriority ()

Позволява ви да знаете приоритета на нишката.

Стойността на параметъра в метода setPriority не може да бъде произволна. Той трябва да варира от MIN_PRIORITY до MAX_PRIORITY. При създаването си нишката има приоритет NORM_PRIORITY .

MIN_PRIORITY = 1.
NORM_PRIORITY = 5.
MAX_PRIORITY = 10.

Възможно ли е да спрете една нишка, като намалите нейния приоритет до 0?

Отговор в статията: „Топ 50 въпроса за интервю. Тема: Многопоточност "

Намерени във форума.

Java предоставя богати API за всичко, но по ирония на съдбата не предоставя удобни начини за спиране на нишка. JDK 1.0 имаше няколко метода за контрол като stop (), suspend () и resume (), които бяха маркирани като оттеглени в бъдещи версии поради потенциални заплахи за блокиране, тъй като тогава разработчиците на Java API не направиха опит да осигурят постоянен, безопасен за нишките и елегантен начин за спиране на нишките. Програмистите разчитат главно на факта, че нишката се спира сама, щом завърши с изпълнението на методите run () или call (). За да спрат ръчно, програмистите се възползват от променлива булева променлива и проверяват нейната стойност във всяка итерация дали има цикли в метода run () или прекъсват нишки с метода interrupt (), за да анулират внезапно заданията.

Конкретно по въпроса: Никога не съм виждал някой да е задавал приоритета на 0.

Защо се нуждаете от клас ThreadGroup ?

ThreadGroup е колекция от нишки, която може да съдържа и други групи нишки. Група нишки образува дърво, в което всяка друга група нишки има родител (с изключение на оригиналния). Нишката има право на достъп до данни от собствената си група нишки, но няма такъв достъп до други групи или до родителската група нишки.

В коя група нишки е основната нишка? ?

Никъде не го намерих)) Кажете къде е))

Какво представлява моделът на ThreadPool ?

Има откъс от статията на wikipedia за това:

При компютърното програмиране моделът на пула от нишки (също репликирани работници или модел на работник-екипаж) е мястото, където се създават редица нишки за изпълнение на редица задачи, които обикновено се организират на опашка. Резултатите от изпълняваните задачи също могат да бъдат поставени в опашка или задачите може да не върнат резултат (например, ако задачата е за анимация). Обикновено има много повече задачи, отколкото нишки. Веднага след като нишката завърши задачата си, тя ще поиска следващата задача от опашката, докато всички задачи бъдат завършени. След това нишката може да прекрати или да заспи, докато не са налични нови задачи.

Броят на използваните нишки е параметър, който може да бъде настроен, за да осигури най-добра производителност. Освен това броят на нишките може да бъде динамичен в зависимост от броя на чакащите задачи. Например уеб сървърът може да добавя нишки, ако влязат множество заявки за уеб страници, и може да премахва нишки, когато тези заявки намаляват. Цената на наличието на по-голям пул от нишки е увеличеното използване на ресурсите. Алгоритъмът, използван за определяне кога да се създават или унищожават нишки, ще окаже влияние върху цялостната производителност:

  • създайте твърде много нишки и ресурсите се губят, а времето също се губи, създавайки неизползвани нишки
  • унищожете твърде много нишки и по-късно ще бъде отделено повече време за създаването им отново
  • създаването на нишки твърде бавно може да доведе до лоша производителност на клиента (дълго време на изчакване)

В компютърното програмиране има модел на пул от нишки, при който се създава определен брой нишки за изпълнение на различни задачи, които обикновено се поставят на опашка. Резултатите от изпълнени задачи също могат да бъдат поставени на опашка или задачите може да не върнат никакъв резултат (например, ако задачата е за анимация).

Обикновено има много повече задачи, отколкото нишки. След като нишката завърши задачата си, тя ще поиска следващата задача от опашката, докато всички задачи приключат. След това потокът може да прекъсне или да заспи. Броят на използваните нишки е параметър, който може да бъде настроен, за да осигури най-добра производителност. Освен това броят на нишките може да бъде динамичен в зависимост от броя на възникналите задачи. Например уеб сървърът може да добавя нишки, ако влязат заявки от множество уеб страници, и може да премахва нишки, когато има по-малко заявки. С увеличаване на размера на пула от нишки, използването на компютърни ресурси се увеличава. Алгоритъмът, използван за определяне кога да се създават или унищожават нишки, ще окаже влияние върху цялостната производителност: - Създаването на твърде много нишки губи ресурси и време.

Унищожете твърде много нишки и по-късно ще бъде отделено повече време, за да ги създадете - твърде бавното създаване на нишки може да доведе до лоша производителност на клиента.

Защо е необходим ThreadPoolExecutor ?

публичен клас ThreadPoolExecutor разширява AbstractExecutorService

ExecutorService, която изпълнява всяка изпратена задача, използвайки една от евентуално няколко обединени нишки, обикновено конфигурирана с помощта на фабричните методи на Executors.

Пуловете от нишки се отнасят до два различни проблема: те обикновено осигуряват подобрена производителност, като изпълняват голям брой асинхронни задачи поради намалените режийни разходи за обаждания на задача, и осигуряват средство за ограничаване и контрол на ресурсите, включително използваните нишки, докато изпълняват набор от задачи. Всеки ThreadPoolExecutor поддържа и някои основни статистически данни, като например броя на изпълнените задачи.

За да бъде полезен в широк кръг от контексти, този клас предлага много регулируеми параметри и лостове за разтегливост. Програмистите обаче се насърчават да използват по-удобните фабрични методи на Executors.newCachedThreadPool () (неограничен пул от нишки, с автоматично възстановяване на нишките), Executors.newFixedThreadPool (int) (пул от нишки с фиксиран размер) и Executors.newSingleThreadExecutor () ( единична нишка на фона), които предварително конфигурират настройките за най-често използваните случаи.

Колко начина за създаване на нишка знаете?

На езиково ниво има два начина за създаване на нишка. Обектът на класа java.lang.Thread е нишка, но за изпълнението му е необходима задача, която е обект, който реализира интерфейса java.lang.Runnable. Тъй като класът Thread реализира интерфейса Runnable, можете да замените метода run (), като наследите своя клас от Thread или като внедрите интерфейса Runnable в него. .

За какво се използва класът Future ?

Future съхранява резултата от асинхронно изчисление. Можете да започнете изчисление, като дадете на някого бъдеще и да забравите за него. Собственикът на обекта Future може да получи резултата, когато е готов.

Какви са предимствата на Callable над Runnable ?

Интерфейсът Callable е много по-подходящ за създаване на задачи, предназначени за паралелно изпълнение, отколкото интерфейсът Runnable или клас Thread. Трябва да се отбележи, че възможността за добавяне на такъв интерфейс се появи само като се започне с версията на Java 5, тъй като ключовата характеристика на интерфейса Callable е използването на параметризирани типове (генерични), както е показано в списъка.

Веднага трябва да обърнете внимание на ред 2, където е посочено, че интерфейсът Callable е параметризиран, а конкретното му изпълнение - клас CallableSample, зависи от типа String. Ред 3 показва подписа на метода за главно повикване във вече параметризираната версия, тъй като типът на връщаната стойност също е зададен на String. Всъщност това означава, че е създадена задача, резултатът от която ще бъде обект от тип String (виж ред 8). По същия начин можете да създадете задача, която ще създаде и върне обект от всякакъв необходим тип в метода на повикване. Това решение е много по-удобно в сравнение с метода за изпълнение в интерфейса Runnable, който не връща нищо (неговият тип на връщане е невалиден) и затова трябва да измислите заобикалящи решения, за да извлечете резултата от задачата.

Друго предимство на интерфейса Callable е възможността за „изхвърляне“ на изключения, без да се засягат други текущи задачи. Ред 3 показва, че изключение може да бъде "хвърлено" от метод, което на практика означава всяко изключение, тъй като всички изключения са потомци на java.lang.Exception. Ред 5 използва тази функция, за да хвърли проверен IOException. Методът за изпълнение на интерфейса Runnable изобщо не позволява хвърляне на контролирани изключения и хвърлянето на неконтролирано (по време на изпълнение) изключение води до спиране на нишката и цялото приложение.

Възможно ли е да се отмени изпълнението на задача, като се използва клас Future ?

Въз основа на тази дискусия, повдигната върху Хабре, се оказва, че е невъзможно.