В этой статье анализируется четыре использования пула Java Thread для вашей ссылки. Конкретный контент заключается в следующем
1. Недостатки новой ветки
Вы все еще просто выполняете новый поток следующим образом при выполнении асинхронной задачи?
Новый поток (new Runnable () {@Override public void run () {// todo Автогенерированный метод stub}}). start ();Тогда у вас будет слишком много выходов, недостатки новых потоков следующие:
а Производительность новой ветки каждый раз плохая.
беременный В потоках не хватает единого управления, которое может создавать новые потоки без ограничений, конкурировать друг с другом и может занимать слишком много системных ресурсов, чтобы вызвать сбои или OOM.
в Отсутствие большего количества функций, таких как выполнение времени, периодическое выполнение, прерывание потока.
По сравнению с новой темой преимущества четырех пулов потоков, предоставленные Java:
а Повторно используйте существующие потоки, чтобы уменьшить накладные расходы создания и вымирания объектов, и хорошо выполнять.
беременный Он может эффективно контролировать максимальное количество одновременных потоков, улучшить частоту использования системных ресурсов, избегать чрезмерной конкуренции за ресурсами и избежать блокировки.
в Предоставляет такие функции, как выполнение времени, регулярное выполнение, отдельное потоковое управление, одновременное управление числами и т. Д.
2. Пул ниток Java
Java предоставляет четыре типа пулов потоков через исполнителей, а именно:
NewcachedThreadpool создает кэш -бассейн. Если длина пула потоков превышает потребности в обработке, она может гибко перерабатывать потоки простара. Если нет переработки, создайте новую ветку.
NewFixedThreadPool создает пул потоков с фиксированной длиной, который может управлять максимальным количеством параллелизма потоков, а избыточные потоки будут ждать в очереди.
NewschedudThreadpool создает пул потоков с фиксированной длиной, который поддерживает временную и периодическую выполнение задачи.
NewsingLethreadExeCutor создает однопоточный пул потоков, который будет использовать только уникальный рабочий поток для выполнения задач, гарантируя, что все задачи выполняются в указанном порядке (FIFO, Lifo, Priority).
(1) newcachedthreadpool:
Создайте кэшированный бассейн. Если длина пула потоков превышает потребности в обработке, вы можете гибко перерабатывать потоки простара. Если нет переработки, создайте новую ветку. Пример кода заключается в следующем:
Executorservice cachedthreadpool = executors.newcachedthreadpool (); for (int i = 0; i <10; i ++) {final int index = i; try {thread.sleep (index * 1000); } catch (прерванное искусство e) {e.printstacktrace (); } cachedThreadpool.execute (new Runnable () {@OverridePublic void run () {System.out.println (index);}});}Пул ниток бесконечен. Когда вторая задача выполнена, первая задача была выполнена, и поток, выполняющий первую задачу, будет использоваться повторно без создания нового потока каждый раз.
(2) newfixedthreadpool:
Создайте пул потоков с фиксированной длиной, который может управлять максимальным количеством параллелизма потоков, а избыточные потоки будут ждать в очереди. Пример кода заключается в следующем:
Executorservice fixdthreadpool = experators.newfixedthreadpool (3); for (int i = 0; i <10; i ++) {final int index = i; fixedthreadpool.execute (new Runnable () {@OverridePublic void run () {try {System.out.println (index); thread.sleep (2000);} catch (прерывание Extexception e) {// todo Auto-Generated Catch Block E.printStackTrace ();}}});};Поскольку размер бассейна потоков составляет 3, спят через 2 секунды после индекса выходов каждой задачи, поэтому 3 числа печатаются каждые две секунды.
Размер пула потоков с фиксированной длиной лучше всего устанавливается в соответствии с системными ресурсами. Например, runtime.getRuntime (). Доступный processors (). Пожалуйста, обратитесь к Preloaddatacache.
(3) NewschedledThreadpool:
Создайте пул потоков с фиксированной длиной, который поддерживает временные и периодические выполнения задачи. Пример кода для отсроченного выполнения заключается в следующем:
Gadulledexecutorservice seduldThreadpool = experators.newschedudThreadpool (5); warduldThreadpool.schedule (new Runnable () {@OverridePublic void run () {System.out.println ("Задержка 3 секунды");}}, 3, timeUnit.seconds);Указывает выполнение задержки на 3 секунды.
Пример кода выполняется регулярно следующим образом:
warduldThreadpool.scheduleatfixedRate (new Runnable () {@OverridePublic void run () {System.out.println ("Задержка 1 секунды и проличные каждые 3 секунды");}}, 1, 3, timeUnit.seconds);Это означает, что задержка выполняется каждые 3 секунды через 1 секунду.
PredulleDexeCutorService безопаснее и мощнее, чем таймер
(4) NewsingLethreadExeCutor:
Создайте однопоточный пул потоков, который будет использовать только уникальный рабочий поток для выполнения задач, гарантируя, что все задачи выполняются в указанном порядке (FIFO, LIFO, Приоритет). Пример кода заключается в следующем:
Executorservice singleThreadExeCutor = executors.newsingleThreadExeCutor (); for (int i = 0; i <10; i ++) {final int index = i; SingleThreadExeCutor.Execute (new Runnable () {@OverRidePublic void Run () {try {system.out.print.println (index); (Прерывание Exception e) {// Todo Auto Generated Catch Block e.printstacktrace ();Результаты выводятся в последовательности, что эквивалентно выполнению каждой задачи в последовательности.
Большинство текущих программ с графическим интерфейсом однопоточные. Одиночные потоки в Android могут использоваться для операций базы данных, операций файлов, пакетной установки приложений, пакетного удаления приложений и т. Д., Которые не подходят для одновременного, но могут блокировать IO и влиять на ответ потоков пользовательского интерфейса.
Функция пула потоков:
Функция пула потоков состоит в том, чтобы ограничить количество потоков, выполненных в системе.
В зависимости от системной среды количество потоков может быть автоматически или вручную установлено для достижения наилучшего операционного эффекта; Меньше системных ресурсов потрачено впустую, и больше заторов системы не высока. Используйте пул потоков, чтобы управлять количеством потоков, и другие потоки ждут в очереди. После выполнения задачи первая задача взята из очереди для запуска выполнения. Если в очереди нет процесса ожидания, этот ресурс пула потоков ждет. Когда новая задача должна быть выполнена, если в пуле потоков есть потоки работников ожидания, она может начать работать; В противном случае он войдет в очередь ожидания.
Зачем использовать пул потоков:
1. Уменьшает количество потоков времени, создаваемых и уничтожены, и каждый рабочий поток может быть использован повторно и может выполнять несколько задач.
2. Количество рабочих потоков в пуле потоков может быть скорректировано в соответствии с способностью системы предотвратить отсоединение сервера из -за чрезмерного потребления памяти (каждый поток требует около 1 МБ памяти. Чем больше потоков открывается, тем больше поглощенная память, и, наконец, сбой.
Интерфейс верхнего уровня пула потоков в Java является исполнителем, но строго говоря, исполнитель-не пул потоков, а просто инструмент для выполнения потоков. Настоящий интерфейс пула потоков является исполнительницей.
Несколько более важных категорий:
Executorservice: интерфейс бассейна True Thread.
DEDULEDEXECUTORSERVICE: он может быть похож на Timer/Timertask, решая проблемы, требующие повторных задач.
ThreadPoolexeCutor: реализация ExecutorService по умолчанию.
GraduledThreadPoolexeCutor: реализация класса интерфейса ganedExecutorservice, который наследует ThreadPoolexeCutor, реализация класса периодического планирования задач.
Настройка пула потоков довольно сложно, особенно когда принцип пула потоков не очень ясен. Весьма вероятно, что настроенный пул потоков не лучше. Следовательно, в классе исполнителей предусмотрены некоторые статические фабрики для создания некоторых часто используемых пулов потоков.
1. newsingletreadexecutor
Создайте один бассейн потоков. Этот пул потоков имеет только одну поток, который работает, что эквивалентно одному потоку, выполняющему все задачи в сериале. Если этот уникальный поток заканчивается из -за исключения, то будет новый поток, чтобы заменить его. Этот пул потоков гарантирует, что порядок выполнения всех задач выполняется в порядке подачи задачи.
2.newfixedthreadpool
Создайте пул потоков фиксированного размера. Каждый раз, когда задача отправляется, поток создается до тех пор, пока поток не достигнет максимального размера пула резьбов. Размер пула потоков остается таким же, когда он достигнет своего максимального значения. Если поток заканчивается из -за исключения выполнения, пул потоков добавит новый поток.
3.newcachedthreadpool
Создайте кэшированный бассейн. Если размер пула потоков превышает поток, необходимый для обработки задачи,
Тогда некоторые простоя (без выполнения задачи за 60 секунд) будут переработаны. Когда количество задач увеличивается, этот пул потоков может разумно добавлять новые потоки для выполнения задачи. Этот пул потоков не ограничивает размер пула потоков, который полностью зависит от максимального размера потока, который может создать операционная система (или JVM).
4.newschedledthreadpool
Создайте пул потоков неограниченного размера. Этот пул потоков поддерживает необходимость периодически и периодически выполнять задачи.
Пример кода
1. Пул потоков фиксированного размера, newfixedthreadpool:
пакет app.executors; импортировать java.util.concurrent.executors; импортировать java.util.concurrent.executorservice; / ** * Поток java: пул потоков * * @author xiho */ public class test {public static void main (string [] args) {// Создать пул потоков с фиксированным количеством повторно используемых потоков expertorservice pool = expertions.newfixedthreadpool (2); // Создание потока потока t1 = new MyThread (); Thread T2 = New Mythread (); Thread T3 = New Mythread (); Тема T4 = новый Mythread (); Thread T5 = New Mythread (); // Поместите поток в бассейн для выполнения пула.execute (t1); pool.execute (t2); pool.execute (t3); pool.execute (t4); pool.execute (t5); // закройте пул пула потоков.shutdown (); }} класс MyThread Extends Thread {@Override public void run () {System.out.println (thread.currentThread (). getName () + "выполнение ..."); }}Результат вывода:
Pool-1-Thread-1 выполняется. Полем Полем Pool-1-Thread-3 выполняется. Полем Полем Pool-1-Thread-4 выполняется. Полем Полем Pool-1-Thread-2 выполняется. Полем Полем Pool-1-Thread-5 выполняется. Полем Полем
Измените параметры в executorservice pool = executors.newfixedthreadpool (5): executorservice pool = executors.newfixedthreadpool (2), а результат вывода -:
Pool-1-Thread-1 выполняется. Полем Полем Pool-1-Thread-1 выполняется. Полем Полем Pool-1-Thread-2 выполняется. Полем Полем Pool-1-Thread-1 выполняется. Полем Полем Pool-1-Thread-2 выполняется. Полем Полем
Из приведенных выше результатов мы видим, что параметр newfixedthreadpool указывает максимальное количество потоков, которые могут работать. После добавления больше, чем это количество потоков, они не будут работать. Во -вторых, потоки, добавленные в пул потоков, находятся в управляемом состоянии, и на работу потока не влияет заказ соединения.
2. Пул ниток для одного задачи, NewsingLethreadExeCutor:
Просто измените executorservice pool = executors.newfixedthreadpool (2) в вышеуказанном коде в Presorservice Pool = executors.newsingleThreadExeCutor ();
Результат вывода:
Pool-1-Thread-1 выполняется. Полем Полем Pool-1-Thread-1 выполняется. Полем Полем Pool-1-Thread-1 выполняется. Полем Полем Pool-1-Thread-1 выполняется. Полем Полем Pool-1-Thread-1 выполняется. Полем Полем
Видно, что каждый раз, когда вы называете метод выполнения, метод запуска потока 1 фактически вызывается в конце.
3. Пул потоков с переменным размером, newcachedthreadpool:
Подобно вышеупомянутому, просто измените способ создания пула: expersorservice pool = experators.newcachedthreadpool ();
Результат вывода:
Pool-1-Thread-1 выполняется. Полем Полем Pool-1-Thread-2 выполняется. Полем Полем Pool-1-Thread-4 выполняется. Полем Полем Pool-1-Thread-3 выполняется. Полем Полем Pool-1-Thread-5 выполняется. Полем Полем
Этот метод характеризуется тем фактом, что новые пулы потоков могут быть созданы по мере необходимости, но они будут использоваться повторно, когда будут доступны ранее построенные потоки.
4. Задержка пула соединений, NewschededThreadpool:
открытый класс testscheduledThreadPoolexeCutor {public static void main (string [] args) {preseedThreadPoolexeCutor exc = new PredicleDThreadPoolexeCutor (1); exec.scheduleatfixedrate (new Runnable () {// Исключение запускается время от времени @Override publicvoid run () {// бросить новый runtimeexception (); System.out.println ("================================================================================= ========================================================================================== ========================================================================================== ========================================================================================== TimeUnit.milliseconds);Результат вывода:
================838464454951683866438290348388643830710================839064385138383926438793198400643939383
Выше приведено в этой статье, я надеюсь, что это будет полезно для каждого обучения.