Как работи в света на Java

Как работи в света на Java. Тема басейн 9

  • 11.04.17 06:48 •
  • kuptservol •
  • • # 326146
  • • Habrahabr
  • Инструкция •
  • 9 •
  • 5600

- като Forbes, само по-добре.

Основен принцип на програмиране е: не изобретяваме колелото. Но понякога, за да разбере какво се случва и как да използвате инструмента, правилно, ние трябва да го направя. Днес измисли модел многонишков задачи.

Представете си, че имате, което причинява тежко натоварване на процесора:

Ние искаме възможно най-скоро, за да се справят с редица задачи, опитайте се да *:

На моята количка с 4 физически ядра на процесора ресурси отгоре -pid:

извършване на 104 секунди.

Както можете да видите, изтеглянето един процесор на един Java-процес, при работеща нишка е 100%, но като цяло използването на процесора в потребителското пространство е само 2,5%, а ние имаме много неизползвани системни ресурси.

Нека се опитаме да използваме повече, добавяйки още теми работник:

ThreadPoolExecutor

За да се ускори, ние използвахме ThreadPool - Java в ролята си ThreadPoolExecutor, които могат да бъдат приложени директно или от един от методите в класа на Utilities. Ако погледнем вътре ThreadPoolExecutor, ние можем да намерим място:

в които задачите се развиват, ако използвате повече нишки от размера на първоначалната басейна. Ако се сблъскате с по-малък от първоначалния размер на басейна потоци басейн ще се опита да започнете нова тема:

Всеки addWorker започва нова нишка, за да Изпълнима задача, която анкети workQueue за нови задачи и да ги изпълнява.

ThreadPoolExecutor има много ясна Javadoc, така че няма смисъл да перифразирам. Вместо това, нека се опитаме да направим нашия собствен:

Сега, нека да изпълни същата задача като по-горе, с нашия басейн.
Промяна на линия в MultithreadClient:

Водещ време е почти същото - на 15 секунди.

потоци размер басейн

Нека се опитаме да допълнително да увеличи броя на стартираните нишки в басейна - 100.

Можем да видим, че времето за изпълнение се увеличи до 28 секунди - защо се случи това?

Има няколко причини, поради които независими производителност могат да попаднат, например, поради контекст постоянна CPU превключва, когато той спира работа по една задача и трябва да се премине към друг, превключване включва спестяване на държавата и състоянието на възстановяване. Докато процесора. зает състояние превключване, не прави никаква полезна работа по дадена задача.

Брой на контекстни процес ключове може да се види, като погледнете в настройките в изхода CSW топ отбори.

Как да изберете размера на басейна?

Размер зависи от вида на задачите, изпълнявани. Разбира се, размерът на конец басейн трябва да бъде рядко zahardokozhen, по-скоро би трябвало да се персонализира и показва оптималния размер на мониторинг изпълними задачи на честотната лента.

Ако приемем, че потоците не блокират взаимно, няма I / O изчакайте състояние, и време за обработка задача е същата, оптимално нишка басейн = Runtime.getRuntime (). AvailableProcessors () + 1.

Ако потоци очаква главно I / O, оптималният размер на басейна трябва да се увеличи чрез връзката между процес латентност и време изчисление. Например. Ние имаме един процес, който прекарва 50% от iowait време, а след това с размерите на басейна може да бъде 2 * Runtime.getRuntime (). AvailableProcessors () + 1.

Други видове басейни

Тема басейн с лимит на паметта, който да блокира изпращането на проблема, когато в опашката твърде много задачи MemoryAwareThreadPoolExecutor


  • Нишка басейн, който регистрира JMX-компонент за настройки за мониторинг и размер басейн в изпълнение.
    JMXEnabledThreadPoolExecutor

  • Можете да намерите изходния код тук.