1. Введение
Рациональное использование пулов потоков может принести три преимущества. Сначала: уменьшить потребление ресурсов. Уменьшите потребление, вызванное созданием и разрушением потока, повторно используя созданные потоки. Второе: улучшить скорость отклика. Когда наступает задача, задача может быть выполнена сразу после создания потока. Третий: улучшить управление потоком. Темы - это дефицитные ресурсы. Если они созданы неограниченным, они не только потребляют системные ресурсы, но и снижают стабильность системы. Использование пулов потоков может быть единым распределением, настройкой и мониторингом. Однако, чтобы рационально использовать пулы потоков, вы должны хорошо знать его принципы.
2. Использование пула.
Четыре типа потоков, предоставленные исполнителями 1.newcachedThreadpool, создают кэшируемый пул потоков. Если длина пула потоков превышает потребности в обработке, она может гибко перерабатывать потоки простара. Если нет переработки, создайте новую ветку. 2.newfixedthreadpool создает пул потоков с фиксированной длиной, который может управлять максимальным количеством параллелизма потоков, а избыточные потоки будут ждать в очереди. 3.newschedledThreadpool создает пул потоков с фиксированной длиной, который поддерживает временное и периодическое выполнение задач. 4.newsingleThreadExeCutor создает однопоточный пул потоков, который будет использовать только уникальный рабочий поток для выполнения задач, гарантируя, что все задачи выполняются в указанном порядке (FIFO, Lifo, Priority).
1.newcachedthreadpool создает кэш -бассейн. Если длина пула потоков превышает потребности в обработке, она может гибко перерабатывать потоки простара. Если нет переработки, создайте новую ветку. Пример заключается в следующем
Executorservice executorservice = executors.newcachedthreadpool (); for (int i = 0; i <5; i ++) {final int index = i; try {thread.sleep (index * 1000); } catch (прерванное искусство e) {e.printstacktrace (); } executorservice.execute (new Runnable () {@Override public void run () {system.out.println (thread.currentThread (). getName () + "," + index);}});} // Консольная информация Pool-1-Thread-1,0POOL-1-TTREARD-1,1POOL-1-TTREARD-1,2POOL-1-TTREARD-1,3POOL-1-TTREARD-1,42.newfixedthreadpool создает пул потоков с фиксированной длиной, который может управлять максимальным количеством параллелизма потоков, а избыточные потоки будут ждать в очереди. Пример заключается в следующем
Executorservice fixdthreadpool = executors.newfixedthreadpool (4); для (int i = 0; i <5; i ++) {final int index = i; fixedthreadpool.execute (new Runnable () {@override public void run () {try {system.out.println (thread.currentThread (). getName () + "," + index); think.sleep (2000);} catch (retreptexexception e) {e.printStacktrace ();}}}}}}); Pool-1-Thread-1,0POOL-1-TTREARD-2,1POOL-1-THREAD-3,2POOL-1-TTREARD-4,3POOL-1-TTREARD-1,43.newschedledThreadpool Создайте пул потоков с фиксированной длиной, а примеры вспомогательных циклов и задач срока следующие
DEDULEDEXECUTORSERVICE DEDULEDTHREADPOOL = executors.newschedledThreadpool (5); System.out.println ("До:" + System.currentTimeMillis ()/1000); cheduledThreadpool.schedule (new Runnable () {@Override public void run () {System.out.println ("Задержка выполнения в течение 3 секунд:" + system.currentTimeMillis ()/1000);}}, 3, TimeUnit.seconds); System.out.println ("whure:" +System.currentTimeMiLlis ()/1000); // Информация о консоли перед: 1518012703AFTER: 1518012703 Задержка на 3 секунды: 1518012706System.out.println ("До:" +System.currenttimillis ()/1000); {@Override public void run () {System.out.println ("После задержки 1 секунды, выполнить один раз через 3 секунды:" +System.currentTimeMillis ()/1000);Консольное сообщение
До: 1518013024
После: 1518013024
После 1 секунды, выполните один раз через 3 секунды: 1518013025
После 1 второй задержки выполните один раз через 3 секунды: 1518013028
После 1 второй задержки выполните один раз через 3 секунды: 1518013031
4.newsingleThreadExeCutor создает однопоточный пул потоков, который использует только рабочие потоки для выполнения задач, обеспечивая заказ. Пример заключается в следующем
Executorservice singleThreadExeCutor = executors.newsingleThreadExeCutor (); for (int i = 0; i <10; i ++) {final int index = i; SingleThreadExeCutor.Execute (new Runnable () {@Override public void run () {try {System.out.println (Thread.currentThread (). getName () + "," + index); thread.sleep (2000);} Catch (TreamruptExcept e) {e.printStacktrace ();});Информация о консоли
Pool-1-Thread-1,0
Pool-1-Thread-1,1
Pool-1-Thread-1,2
Pool-1-Thread-1,3
Pool-1-Thread-1,4
Отправить задачи в пул потоков. Разница между execute () и propect () в классе ThreadPoolexeCutor на самом деле является методом, объявленным в исполнителе. Он реализован в ThreadPoolexeCutor. Этот метод является основным методом ThreadPoolexeCutor. С помощью этого метода можно отправить задачу в пул потоков и передать в пул потоков для выполнения.
Метод отправки () - это метод, объявленный в исполнителе. Это было реализовано в AbstractExeCutorService. Это не переписывается в ThreadPoolexecutor. Этот метод также используется для отправки задач в пул потоков. Тем не менее, он отличается от метода execute (). Это может вернуть результат выполнения задачи. Проверьте реализацию метода отправки () через исходный код, и вы обнаружите, что на самом деле это метод выполнения (), но он использует будущее для получения результата выполнения задачи.
/** * @Throws decuceedExecutionException {@InheritDoc} * @Throws nullPointerException {@InheritDoc} */public future <?> отправить (выполняется задача) {if (task == null) добавить новый nullpointerException (); Runnablefuture <void> ftask = newtaskfor (задача, null); выполнить (ftask); вернуть ftask;}Закрытие пула потоков мы можем закрыть пул потоков, вызвав метод выключения или выключения пула потоков, но их принципы реализации различны. Принцип выключения состоит в том, чтобы просто установить состояние пула потоков в состояние выключения, а затем прервать все потоки, которые не выполняют задачи. Принцип ShutdownNow заключается в том, чтобы пройти через рабочие потоки в пуле потоков, а затем вызовать метод прерывания потока один за другим, чтобы прервать поток, поэтому задачи, которые не могут отвечать на прерывания, никогда не могут быть прекращены. ShutdownNow сначала установит состояние пула потоков, чтобы остановиться, а затем попытайтесь остановить все потоки, которые выполняют или приостанавливают задачи, и вернуться в список ожидания задач.
Пока называется один из этих двух методов закрытия, метод iSshutDown вернет True. Когда все задачи были закрыты, это означает, что пул резьбы успешно закрыт. Призыв к Istermined метод вернет True. Что касается того, какой метод мы должны позвонить, чтобы закрыть пул потоков, он должен определяться характеристиками задачи, представленных в пул потоков. Обычно выключается, чтобы закрыть бассейн потоков. Если задача не должна быть выполнена, можно вызвать ShutdownNow.
3. Анализ пула потоков
Анализ процесса: Основной рабочий процесс пула потоков показан на рисунке ниже: Основной рабочий процесс пула потоков Java
Из приведенного выше рисунка мы видим, что при отправке новой задачи в пул потоков поток обработки пула потоков выглядит следующим образом:
** Анализ исходного кода. ** Приведенный выше анализ процесса позволяет нам интуитивно понимать принцип работы пулов потоков. Давайте используем исходный код, чтобы увидеть, как он реализован. Пул потоков выполняет задачи следующим образом:
public void execute (runnable command) {if (command = null) бросить новый nullpointerException (); int c = ctl.get (); if (WorkerCountof (c) <corepoolsize) {if (addworker (command, true)) return; c = ctl.get (); } if (isrunning (c) && wormqueue.offer (command)) {int recheck = ctl.get (); if (! isrunning (Receck) && remove (command)) отклонить (команда); else if (workercountof (receck) == 0) addworker (null, false); } else if (! AddWorker (command, false)) отклонить (команда);} Рабочая ветка. Когда пул резьбы создает поток, он будет инкапсулировать поток в рабочую потоку. После того, как работник выполнит задачу, он также будет бесконечно зацикливаться на выполнении задач в очереди работы.
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.