Как работи в света на 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
JMXEnabledThreadPoolExecutor
Можете да намерите изходния код тук.