Что такое бассейн потоков
Пул потоков - это коллекция потоков, которые [Loop выполнение] Несколько логики применения в одном или нескольких потоках.
Вообще говоря, бассейны потоков имеют следующие детали:
Один или несколько потоков, которые выполняют основную задачу.
Управляющие потоки, используемые для планирования управления.
Очередь задач должна быть выполнена.
Функция пула потоков:
Функция пула потоков состоит в том, чтобы ограничить количество потоков, выполненных в системе.
В зависимости от системной среды количество потоков может быть автоматически или вручную установлено для достижения наилучшего операционного эффекта; Меньше системных ресурсов потрачено впустую, и больше заторов системы не высока. Используйте пул потоков, чтобы управлять количеством потоков, и другие потоки ждут в очереди. После выполнения задачи первая задача взята из очереди для запуска выполнения. Если в очереди нет процесса ожидания, этот ресурс пула потоков ждет. Когда новая задача должна быть выполнена, если в пуле потоков есть потоки работников ожидания, она может начать работать; В противном случае он войдет в очередь ожидания.
Реализовать пул потоков самостоятельно
Основываясь на вышеуказанном понимании пула потоков, мы пишем наш собственный простой пул потоков:
Простой интерфейс пула потоков:
public interface threadpool <job extends runnable> {// выполнить задачу (задание), это задание должно реализовать Runnable void execute (задание задания); // Закройте переключение пула рядного пула (); // Увеличение потока работника, то есть поток, используемый для выполнения AddWorkers задачи void (int num); // уменьшить рабочую резьбу void removeWorker (int num); // Получить количество задач, ожидающих выполнения void getJobsize ();}Клиент может отправить задание в пул потоков с помощью метода выполнения (задание) для выполнения, и клиенту не нужно ждать выполнения задания вообще. В дополнение к методу Execute (JOW) интерфейс пула потоков предоставляет методы для увеличения/уменьшения потоков работников и закрытия пулов потоков. Каждый клиент подает работу, которая введет в очередь рабочей очередь, и ждать обработки рабочего потока.
Реализация интерфейса пула потоков по умолчанию
открытый класс defaultThreadpool <job extends runnable> реализует ThreadPool <Job> {// Максимальное количество потоков для потоков пула // Значение по умолчанию поток технического обслуживания пула потока Private Static infit int default_worker_numbers = 5; // Минимальное количество потоковых работников бассейна. // Поддерживать список рабочих мест, который добавляет инициированную клиентом работу частного окончательного LinkedList <Job> jobs = new LinkedList <Job> (); // Список рабочих потоков Частный окончательный список <Borker> kingers = collections.synchronizedlist (new ArrayList <borever> ()); // Количество рабочих потоков Private Int Workernum; // генерировать частное атомалонг Threadnum = new Atomiclong (); // генерировать пул потоков public defaultHreadpool () {this.workernum = default_worker_numbers; инициализируемые работники (this.workernum); } public DefaultThreadPool (int num) {if (num> max_worker_numbers) {this.workernum = default_worker_numbers; } else {this.workernum = num; } инициализировать рабочие (this.workernum); } // Инициализация каждого потока работника private void initiazeWorkers (int num) {for (int i = 0; i <num; i ++) {Worker Worker = new Worker (); // Добавить в список работников потоки работников. Адд (работник); // Запуск потока потока работника = новый поток (рабочий); Thread.Start (); }} public void execute (job job) {if (job! = null) {// в соответствии с поток «ожидание/уведомление механизм», мы должны заблокировать рабочие места синхронизированы (jobs) {jobs.addlast (job); jobs.notify (); }}} // Закройте пул потоков, который должен закрыть каждую рабочую потоку public void shutdown () {for (Worker w: kingers) {w.shutdown (); }}} // Добавить тему работника public void AddWorkers (int num) {// Добавить блокировку, чтобы предотвратить увеличение или завершение потока, в то время как следующий поток продолжает расти, в результате чего рабочая потока превышает синхронизированный максимальный значение (jobs) {if (num + this.workernum> max_worker_numbers) {num = max_worker_numbers - this.work_worker_numbers). } инициализировать работники (num); this.workernum += num; }} // Уменьшение потока работника public void remoadWorker (int num) {synchronized (jobs) {if (num> = this.workernum) {бросить новое allosalargumentException («превышать количество существующих потоков»); } for (int i = 0; i <num; i ++) {Worker worker = works.get (i); if (Worker! = null) {// Закройте поток и удалите работник .shutdown (); Рабочие. РЕМОВА (i); }} this.workernum -= num; }} public int getJobsize () {// todo Автогенерированный метод stub return orderving.size (); } // Определите работник работника класса потока реализует runnable {// указывает, работает ли работник частной летучих логических блинчиков = true; public void run () {while (running) {job job = null; // Поток ждать/механизм уведомления Синхронизирован (jobs) {if (jobs.isempty ()) {try {jobs.wait (); // Поток ожидает пробуждения} catch (прерывание Exception e) {// Ощущает операцию внешнего прерывания на потоке и возвращает Thread.currentThread (). Enterrupt (); возвращаться; }} // Установите работу по работе = jobs.removefirst (); } // выполнить задание if (abob! = Null) {job.run (); }}} // Завершение потока public void shutdown () {running = false; }}}
Из реализации пула потоков видно, что когда клиент вызывает метод выполнения (задание), он будет постоянно добавлять задания в задания списка задач, и каждый поток работника не будет читать задания с заданий для выполнения. Когда задания пуста, рабочая нить входит в состояние ожидания.
После добавления работы метод notify () вызывается на заданиях по очереди, чтобы разбудить рабочую ветку. Здесь мы не называем notifyall (), чтобы избежать траты ресурсов, перемещая все потоки в очередь ожидания в очередь блокировки.
Суть пула потоков заключается в использовании рабочей очередь, защищенной потоком для подключения потоков рабочих и клиентских потоков. Клиентский поток возвращается после того, как вкладывает задачу в очередь работы, в то время как рабочая нить неправильно берет работу из работы по работе и выполняет ее. Когда очередь работы пуста, рабочая нить входит в состояние ожидания. Когда клиент отправляет задачу, он пройдет через любой работник. При представлении большого количества задач пробуждается больше рабочих потоков.
Ссылка: «Искусство одновременного программирования в Java» Fang Tengfei