С увеличением числа ядер ЦП неизбежно использовать многопоточную технологию для полного использования своей вычислительной мощности. Следовательно, технология многопоточности-это технология, которую разработчики сервера должны освоить.
Создание и уничтожение потоков включает в себя системные вызовы и потребляет системные ресурсы, поэтому технология объединения потоков вводится, чтобы избежать частого создания и разрушения потоков.
В Java есть класс инструментов исполнителей, который может создать для нас пул потоков. Суть в том, чтобы новый объект ThreadPoolexeCutor. Пул ниток почти также является обязательным привлечением в вопросы собеседования. Этот раздел объединяет исходный код, чтобы рассказать о принципе работы ThreadExecutor
1. Создание бассейна.
Давайте сначала посмотрим на наиболее полные параметры конструктора ThreadPoolexeCutor:
① CorePoolsize: количество резьбов основных потоков в пуле потоков. По словам, даже если в бассейне потоков нет задач, в бассейне будут потери для CorePoolSize, ожидающие задачи.
②maximumpoolsize: максимальное количество потоков. Независимо от того, сколько задач вы отправляете, максимальное количество рабочих потоков в пуле потоков максимально.
③ KeepaliveTime: время выживания нить. Когда количество потоков в пуле потоков больше, чем corepoolsize, если нет задачи, которую нужно выполнять после ожидания reapeLiveTime, поток выходит.
⑤Unit: это используется для указания единицы KeepAliveTime, например, секунды: TimeUnit.seconds.
⑥ Workqueue: блокировка очереди, и представленные задачи будут размещены в этой очереди.
⑦ Threadfactory: заводская поток, используемая для создания потоков, в основном для названия потока. Название по умолчанию имя потока-Pool-1-Thread-3.
⑧handler: отклонить политику, вызванную, когда потоки в пуле потоков исчерпаны, а очередь заполнена.
Выше приведены параметры, используемые при создании пула потоков. Интервьюеры часто задают этот вопрос во время интервью.
2. Процесс выполнения пула потоков
Вот диаграмма, чтобы проиллюстрировать процесс выполнения пула потоков
Когда задача будет представлен в пул потоков, она сначала определит, меньше текущего количества потоков, чем corepoolsize. Если это меньше, то поток будет создан для выполнения отправленной задачи. В противном случае, задача будет помещена в очередь рабочей промышленности. Если работоспособность заполнена, это определит, меньше ли текущего количества потоков меньше, чем максимально. Если это меньше, то поток будет создан для выполнения задачи. В противном случае будет вызван обработчик, чтобы указать, что пул потоков отказывается получать задачу.
Здесь возьмите исходный код JDK1.8.0_111 в качестве примера, чтобы увидеть конкретную реализацию.
1. Сначала посмотрите на метод Preector Pool Pool
①: Определите, меньше текущего количества активных потоков, чем CorePoolsize. Если это меньше, вызовите AddWorker для создания потока для выполнения задач
②: Если это не меньше, чем CorePoolsize, добавьте задачу в очередь рабочей промышленности.
③: Если Workqueue будет помещен в рабочую силу, поток создания выполнит задачу. Если поток создания в настоящее время не удается (текущее количество потоков не меньше, чем Maximumpoolsize), отклонение будет вызвано (внутренний обработчик вызовов) и отказ принять задачу.
2. Давайте посмотрим на реализацию метода AddWorker
Этот фрагмент кода при создании неточного потока, то есть ядро равно FAST. Определите, превышает ли текущее количество потоков или равное Maximumpoolsize. Если он больше или равен ложному, то есть создание потока не удалось в ③ упомянутом выше.
Вторая половина метода AddWorker:
① Создайте рабочую объект и создайте экземпляр объекта потока.
② Запустите эту ветку
3. Пойдите к работнику, чтобы увидеть его реализацию
Вы можете видеть, что Threadfactory вызывается при создании работника для создания потока. Запуск потока в приведенном выше ② запустит метод запуска работника, который будет вызван потоком.
4. Далее, давайте посмотрим на логику метода бега.
Поток вызовет Runwoker и вызовет метод GetTask, когда цикл, чтобы прочитать задачу из рабочих, а затем выполнить задачу. Пока метод GetTask не возвращает NULL, этот поток не выходит.
5. Наконец, давайте посмотрим на реализацию метода GetTask
① Давайте игнорируем AlluctCoreThreadTimeOut, значение по умолчанию этой переменной является false. WC> CorePoolsize определяет, превышает ли текущее количество потоков, чем CorePoolsize.
② Если текущее количество потоков больше, чем CorePoolSize, метод опроса будет вызван для получения задачи, а время ожидания - это время. Если время KeepAliveTime превышает ограничение по времени, опрос возвращает NULL, а упомянутое выше, упомянутое выше, выйдет в последовательности, и поток будет выполнен.
Если текущее количество потоков меньше, чем CorePoolSize, метод Take Workqueue будет вызван для блокировки в данный момент.
Приведенная выше статья основана на принципе работы и интерпретации исходного кода пула потоков. Эта статья - весь контент, разделенный редактором. Я надеюсь, что это может дать вам ссылку, и я надеюсь, что вы сможете поддержать Wulin.com больше.