Как программисты, мы слишком хорошо знакомы с потоками. Многопоточный параллелизм — это продвинутое знание Java. Нелегко иметь слишком много ям с множеством потоков. Создание потока также является «тяжелой» операцией. Оператор для создания потокаnew Thread()
На первый взгляд кажется, что это новый объект.
Да, создается новый объект, но это не просто обычный объект, который выделяет кусок памяти в куче, ему также нужно вызвать API ядра операционной системы, а затем операционная система выделяет какие-то ресурсы для потока. Таким образом, более распространенные объекты, потоки более «тяжелые».Поэтому нам нужно избегать частого создания и уничтожения потоков, и мы должны контролировать количество потоков. Пул потоков используется для выполнения этой задачи..
Следовательно, многопоточность неотделима от пула потоков, поэтому для освоения многопоточного программирования необходимо понимание пула потоков.Структура пула потоков основана на модели производитель-потребитель: потоки в пуле потоков являются потребителями, а задачи, которые мы помещаем в пул потоков, — производителями.. Можно понять, что пул потоков — это касса ж/д вокзала, а потоки в пуле потоков — это работники витрины кассы ж/д вокзала.Мы идем покупать билеты или возвращать и менять билеты, чтобы дать задания работникам витрины, то есть производство, а затем оконные работники помогают нам вести бизнес, а также это потребление.
Обычно мы используемThreadPoolExecutor
Для создания пула потоков я нашел в нем конструктор с наибольшим количеством параметров.
1. размер ядрапула
В буквальном переводе это размер основного пула,Фактически, это минимальное количество потоков, удерживаемых пулом потоков.,здесьнужно обратить внимание, При инициализации пула потоков, если вы не вызываете два метода prestartAllCoreThreads или prestartCoreThread, эти два метода предназначены для предварительного создания всех основных потоков или создания потока до того, как задача не будет получена. В противном случае после инициализации пула потоков до поступления задачи нет ни одного потока. Темы создаются только тогда, когда приходят задачи.
так вотКоличество сохраненных ядер – это количество потоков, которые не будут повторно использоваться после того, как пул потоков создаст такое количество потоков. Потоки, превышающие размер corePoolSize, будут повторно использованы через определенный период времени..
Но в java1.6 добавлен метод allowCoreThreadTimeOut(boolean value).Если установлено значение true, все потоки со временем будут переработаны, включая основные потоки.
2. максимальный размер пула
Максимальное количество потоков, т.Максимальное количество потоков, которые могут быть в пуле. То есть все окна кассового зала вокзала обслуживаются персоналом. Особенно во время праздников окна в основном открыты.
3. KeepAliveTime, TimeUnit
keepAliveTime — это время выживания, TimeUnit — это единица времени, чтобы указать, является ли число keepAliveTime секундами или миллисекундами и т. д. Эти два параметраКогда количество потоков в нашем пуле потоков превышает corePoolSize, если поток простаивал так долго, как keepAliveTime, то простаивающий поток будет перезапущен, так как пиковый период поездок прошел, и окна касс могут быть закрыты несколько раз. Пустая трата времени открывать столько окон, когда никого нет.
4. Рабочая очередь
Рабочая очередь — это очередь блокировки. В очереди хранятся Runnables, которые необходимо выполнить потоку, то есть задачи. Соответственно, мы стояли в очереди в кассе.
5. нить Фабрика
В переводе по названию это фабрика потоков, то есть мы можем создать фабрику, а затем настроить способ создания потоков, например дать имя набору потоков и т. д. Затем пул потоков создаст потоки, как определено фабрикой. То есть, если имя потока не задано, имя потока может быть что-то вроде thread-1, что нам неудобно для устранения проблемы, поэтомуЛучше дать имя, чтобы идентифицировать его.
6. обработчик
Это политика отклонения, то есть когда все потоки в пуле потоков выполняют задачи, а очередь работ (это ограниченная очередь) также заполнен, и политика отклонения будет выполняться, если будет отправлено больше задач. ThreadPoolExecutor предоставляет четыре стратегии отклонения
1,ThreadPoolExecutor.AbortPolicy()
является политикой отклонения по умолчанию и вызывает исключение RejectedExecutionException.
2,ThreadPoolExecutor.CallerRunsPolicy()
Позвольте потоку, отправившему задачу, выполнить ее самостоятельно. . Кажется, это имеет смысл. У меня нет времени, чтобы сделать это самостоятельно
3.ThreadPoolExecutor.DiscardOldestPolicy()
Отбросить самую старую задачу, которая является первой задачей в рабочей очереди, и добавить новую задачу в рабочую очередь после ее отмены... Это действительно несправедливо.
4.ThreadPoolExecutor.DiscardPolicy()
просто бросьте задачу и не выдавайте никаких исключений... сделайте вид, что не видите серию
В дополнение к этим четырем вы также можете настроить политику отказа,Рекомендуемая пользовательская политика отклонения. Поскольку он более удобен, его можно настроить на понижение уровня обслуживания и другие операции.
Уведомление
Параллельные пакеты Java также предоставляютExecutors
, вы можете быстро создать пул потоков,но не рекомендуетсяExecutors
. Поскольку исполнители создают пулы потоков по умолчанию, используя неограниченные очереди.LinkedBlockingQueue
, склонный к OOM при высокой нагрузке. Поэтому рекомендуется использовать ограниченную очередь.
Суммировать
Таким образом, пул потоков является реализацией модели производитель-потребитель. Пул потоков ограничивает количество потоков и позволяет избежать частого создания и уничтожения потоков. Очередь работ должна существовать, чтобы задачи выполнялись упорядоченно, отлично!
Если есть ошибки, поправьте меня! Личный публичный аккаунт: стратегия прокачки да