Пожалуйста, обратите внимание на источник при перепечатке:blog.CSDN.net/Maple45454…
Несколько дней назад в компании проходило собеседование и задавали много вопросов о пулах потоков.Так как я был новичком, я не был знаком с пулами потоков.К тому же я нервничал и у меня закружилась голова.Организуйте пул потоков здесь.
Преимущества пулов потоков
Что такое пул потоков, что вы делаете, чтобы сделать его, я должен сделать его хорошо, вы должны сделать это много раз, ха-ха, я думаю, что каждый, кто зашел сюда, чтобы прочитать эту статью, имеет небольшое представление о пуле потоков. Итак, позвольте мне разобраться в преимуществах пулов потоков.
1. Повторное использование пулов потоков
Накладные расходы на создание и уничтожение потоков огромны, и эти ненужные накладные расходы значительно сокращаются за счет повторного использования пула потоков.Конечно, поскольку накладные расходы на потребление памяти намного меньше, скорость выполнения потоков также повышается как на дрожжах.
2. Контролируйте количество одновременных потоков в пуле потоков
Новички могут быть незнакомы с термином «параллелизм», поэтому я также объединил энциклопедию Baidu и Bisheng, чтобы получить лучшее объяснение. Помните, что параллелизм — это не то же самое, что параллелизм.
Параллелизм:В течение определенного периода времени несколько программ находятся между выполнением и выполнением, но в определенный момент времени выполняется только одна программа. Мозговой штурм: Орлица-мать кормит птенцов. Птенцов много, а у орлов только один рот. Ей нужно кормить их одного за другим. В конце концов, каждый птенец может есть, но только один из них может быть съеден. съеденный за один раз.Молодой орел может есть вкусную пищу.
параллельно:В течение определенного периода времени каждая программа выполняется со своей независимой и асинхронной скоростью, и программы не мешают друг другу. Мозговой штурм: это как если бы мать-орлица решила, что ее слишком сложно кормить, и наняла няню для каждого птенца, чтобы в какой-то момент времени каждый птенец мог есть одновременно, не мешая друг другу.
Вернемся к пулу потоков. Управление параллелизмом пула потоков может эффективно предотвратить конкуренцию большого количества пулов потоков за ресурсы ЦП и блокировку. Мозговой штурм: Давайте возьмем пример с орлами. Есть только одна мать. Если вы хотите кормить их одного за другим, некоторые голодающие молодые орлы нарушат правила, если они не могут больше ждать. Молодые орлы, которые родились, не ели мягкий рис, поэтому они дрались, и сцена была хаотичной. Орел был зол, настолько невежественен, что никто не хотел его есть, что привело к ситуации, когда в конце концов никто не мог есть.
3. Пул потоков может управлять потоками
Пул потоков может предоставлять такие функции, как синхронизация, периодическое выполнение, управление одним потоком и управление параллелизмом. Например, после выполнения S секунд через пул потоков ScheduledThreadPool задача выполняется каждые N секунд.
Во-вторых, подробное объяснение пула потоков
Рекомендуемые блоги:blog.CSDN.net/Цвет U_Calvin/…
Предположительно после прочтения вышеуказанного блога все нахваливают, но может кто-то из друзей до сих пор этого не помнит, а некоторым друзьям противно, зачем они все в туалетах! Ха-ха, не волнуйся, я дам тебе способ вспомнить.
Давайте сначала поговорим о методе построения с наибольшим количеством параметров, в основном для анализа этих раздражающих параметров.
1. ThreadPoolExecutor
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)
Вот 7 параметров (мы используем больше методов построения 5 параметров в разработке), хорошо, тогда давайте посмотрим на значение семи параметров здесь:
corePoolSize Количество основных потоков в пуле потоков
maxPoolSize Максимальное количество потоков в пуле потоков.
keepAliveTime Период ожидания неосновных потоков.Когда время простоя неосновных потоков в системе превышает keepAliveTime, они будут перезапущены. Если для свойства allowCoreThreadTimeOut ThreadPoolExecutor установлено значение true, этот параметр также представляет период ожидания основного потока.
unit Единица измерения третьего параметра, включая наносекунды, микросекунды, миллисекунды, секунды, минуты, часы, дни и т. д.
Очередь задач в пуле потоков workQueue, которая в основном используется для хранения отправленных, но еще не выполненных задач. Задачи, хранящиеся здесь, передаются методом execute объекта ThreadPoolExecutor.
threadFactory предоставляет функцию создания новых потоков для пула потоков, которую мы обычно используем по умолчанию.
Политика отклонения обработчика, когда поток не может выполнять новые задачи (обычно из-за того, что количество потоков в пуле потоков достигло максимального числа или пул потоков закрыт), по умолчанию, когда пул потоков не может обрабатывать новые потоки, он будет бросать исключение RejectedExecutionException.
эммммм.... Видеть так много раздражающих концепций, это немного высокомерно, у меня все равно большая голова.
Среди этих 7 параметров чаще всего используются corePoolSize, maxPoolSize, keepAliveTime, unit, workQueue, Здесь я в основном извлекаюcorePoolSize, максимальный размер пула иworkQueueПодробно объясняются три параметра.
maxPoolSize (максимальное количество потоков) = corePoolSize (количество основных потоков) + noCorePoolSize (количество неосновных потоков);
(1) Когда currentSize (2) Когда currentSize>=corePoolSize и workQueue не заполнена, добавленные задачи будут размещены в workQueue для выполнения. (3) Когда workQueue заполнена, но currentSize Запустите дополнительный поток для выполнения задачи. (4) Когда currentSize>=corePoolSize, workQueue заполнен, а currentSize>maximumPoolSize, вызывающий обработчик по умолчанию выдает исключение RejectExecutionExpection. Что currentSize, corePoolSize, maxPoolSize и workQueue все запутано, ха-ха, тогда я возьму пример барбекю-ресторана, чтобы все быстрее поняли. Летом очень жарко, поэтому многие барбекю-рестораны также устраивают места на улице, которые делятся на крытые и открытые места для еды барбекю. (В комнате есть телевизор с кондиционером, а в помещении лучше, чем на открытом воздухе, и на улице идет проливной дождь, поэтому клиенты сначала выберут помещение) corePoolSize (внутренние места в барбекю-ресторане), cuurentPoolSize (количество клиентов, посещающих в данный момент барбекю-ресторан), maxPoolSize (закрытый + открытый + все места в зале ожидания барбекю-ресторана), workQueue (зал ожидания, специально созданный ресторан-барбекю для клиентов) Тип (1), когда в барбекю-ресторане не так много людей, много мест в помещении, и все счастливы, счастливо сидят в помещении, едят барбекю и смотрят чемпионат мира по футболу. Тип (2), бизнес идет хорошо, в крытом барбекю-ресторане нет свободных мест, и все не хотят выходить на улицу, чтобы поесть, поэтому они остаются в зале ожидания, а зал ожидания не полон. Типа (3), бизнес процветает, а в крытых и холле свободных мест нет, но клиенты настолько голодны, что остальным ничего не остается, как есть шашлыки под дождем, ха-ха, так жалко. Тип (4) – бизнес процветает, свободных мест в крытом, открытом и зале ожидания нет. Ха-ха, не очень ли имидж, я еще немного не знаком с workQueue. 2. Обозначение других пулов потоков Остальные четыре основных пула потоков - это примерно идея, и их использование подробно объясняется в блоге, который я рекомендую. Я не буду приходить сюда по одному. Здесь я в основном делюсь с вами очень простым для запоминания. Четыре метода пула потоков, когда вы пишете код, вы даже можете думать об этих четырех пулах потоков во время собеседования. (1) Фиксированный пул потоков: Фиксированная китайская интерпретация исправлена. В сочетании с объяснением фиксированного пула потоков более полной точкой зрения является то, что существует пул потоков с фиксированным количеством потоков. Его corePoolSize=maximumPoolSize, а keepAliveTime равно 0, что подходит для мест со стабильными потоками. (2) Однопоточный пул: Сингл интерпретируется как сингл на китайском языке. В сочетании для объяснения единого пула потоков более всеобъемлющим является то, что существует пул потоков с фиксированным числом потоков, и это число равно 1. С математической точки зрения SingleThreadPool должен принадлежать к подмножеству FixedThreadPool. Его corePoolSize=maximumPoolSize=1, а keepAliveTime равно 0, что подходит для операции синхронизации потоков. (3) Кэшедтредпул: Кэширование интерпретируется на китайском языке как хранилище. Объединив это вместе, чтобы объяснить хранимый пул потоков, его легче понять. Поскольку его необходимо хранить, его емкость должна быть очень большой, поэтому его corePoolSize = 0, maxPoolSize = Integer.MAX_VALUE (2 ^ 32-1 — большой номер ) (4) запланированный пул потоков: Позвольте мне растянуться, пришло время поговорить об основном содержании этой главы, а перед этим давайте взглянем на базовые семантические знания. Что такое синглтон? кашель кашель. 1. Синглтон Шаблон Singleton — один из самых простых шаблонов проектирования в Java. Этот шаблон включает в себя один класс, который отвечает за создание своих собственных объектов, обеспечивая при этом создание только одного объекта. Этот класс предоставляет способ прямого доступа к своему единственному объекту без создания экземпляра объекта класса. Меры предосторожности: рекомендовать:ууууууууууууууууууууууууууууууууууууууууууууууууууууууууууууууууууууууууууууууууууууууууууууу 2. Синглтон пула потоков Итак, возникает вопрос. Я хорошо использую пул потоков. Я создаю его, когда использую его, и мне все равно, не нужен ли он мне. Так почему же пул потоков должен быть спроектирован как одноэлементный режим? Затем пришло время посмотреть, где вы применяете пул потоков. В нормальных условиях во всей системе требуется только один пул потоков, и несколько потоков совместно используют пул потоков. Нет необходимости создавать пул потоков для каждого созданного потока. В этом случае вы могли бы также не использовать поток бассейн. Ближе к делу давайте посмотрим, как спроектировать пул потоков в виде одноэлементного шаблона. Хватит нести чушь и говорить о коде Во-первых, создайте пул потоков в классе ThreadPool.Здесь мы создаем пул потоков FixedThreadPool (помните, что конструктор должен быть закрытым, чтобы гарантировать, что он не будет создан другими классами). Затем для внутреннего класса ThreadPool создайте его экземпляр в классе, чтобы реализовать синглтон. Новичок, если что-то не так, пожалуйста, укажите. Ваша поддержка - самая большая мотивация для моего письма!Рекомендуемые блоги:http://blog.csdn.net/u012702547/article/details/52259529
Scheduled интерпретируется как план на китайском языке. Пул потоков объединен для объяснения плана, как следует из названия, поскольку он включает в себя план, он неизбежно требует времени. Итак, ScheduledThreadPool — это пул потоков с функцией регулярного выполнения задач на регулярной основе.
3. Один экземпляр пула потоков
private ThreadPool(int corepoolsize, int maximumpoolsize, long keepalivetime){
this.corepoolsize = corepoolsize;
this.maximumpoolsize = maximumpoolsize;
this.keepalivetime = keepalivetime;
}
public void executor(Runnable runnable){
if (runnable == null){
return;
}
if (mexecutor == null){
mexecutor = new ThreadPoolExecutor(corepoolsize, //核心线程数
maximumpoolsize, //最大线程数
keepalivetime, //闲置线程存活时间
TimeUnit.MILLISECONDS, // 时间单位
new LinkedBlockingDeque<Runnable>(), //线程队列
Executors.defaultThreadFactory(), //线程工厂
new ThreadPoolExecutor.AbortPolicy() //队列已满,而且当前线程数已经超过最大线程数时的异常处理策略
);
}
mexecutor.execute(runnable);
}
// 获取单例的线程池对象
public static ThreadPool getThreadPool() {
if (mThreadPool == null) {
synchronized (ThreadManager.class) {
if (mThreadPool == null) {
int cpuNum = Runtime.getRuntime().availableProcessors();// 获取处理器数量
int threadNum = cpuNum * 2 + 1;// 根据cpu数量,计算出合理的线程并发数
mThreadPool = new ThreadPool(threadNum, threadNum, 0L);
}
}
}
return mThreadPool;
}
Демонстрационный адрес:скачать.CSDN.net/download/share…