Предисловие
Предыдущие статьи сосредоточены на оптимизации базы данных сервисных данных и многопоточной параллельной обработки, а также примеры логики псевдокода до и после преобразования. Конечно, оптимизация бесконечна. Предыдущие поколения сажают деревья, а более поздние поколения наслаждаются тени. Поскольку мы разработчики, поскольку мы стоим на плечах гигантов, мы должны написать более оптимизированные программы.
Спрингбаут депутат JDBctemplate Parath
Случай разработки Springboot: Countdownlatch Многозадачная параллельная обработка
Ремонт
Теоретически, чем больше потоков, тем быстрее может быть программа, но в реальном использовании мы должны рассмотреть потребление ресурса самого потока и разрушения самого потока, а также цель защиты самой операционной системы. Обычно нам нужно ограничить потоки определенным диапазоном, и эта роли играют пулы потоков.
Программная логика
Многозадачная параллельная + обработка пула потоков.png
Проблемы, которые могут быть решены с помощью картинки, должны быть как можно меньше. Конечно, основной принцип по -прежнему нужно помнить и понимать все.
Java Thread Pool
Java предоставляет четыре типа пулов потоков через исполнителей, а именно:
преимущество
Реализация кода
Метод 1 (Countdownlatch)
/*** Многозадачная параллельная + статистика пула потоков* Время создания 17 апреля 2018 г.*/открытый класс Statsdemo {final Static Simpledateformat sdf = new SimpleDateFormat ("yyyy-mm-dd hh: mm: ss"); окончательная статическая строка starttime = sdf.format (new Date ()); / ** * iO-интенсивные задачи = обычно 2 * Количество ядер ЦП (часто в потоках: взаимодействие данных базы данных, загрузка и загрузку файлов, передача сетевых данных и т. Д.) * Задачи с интенсивным процессором = обычно 1 ядра ЦП + 1 (часто в потоках: сложные алгоритмы). Runtime.getRuntime (). Доступный processors (); /*** public ThreadPoolexeCutor (int corepoolSize, int maximumpoolsize, long KeepaliveTime,* TimeUnit Unit, BlockingQueue <Runnable> workqueue)* Corepoolsize используется для указания количества основных потоков* Максимап -lecom Буферная очередь пула потоков, и потоки, которые еще не были выполнены, будут ждать в очереди* Длина очереди монитора, чтобы гарантировать, что ограниченный очередь* Неправильный размер пула резьбы может замедлить скорость обработки, снизить стабильность и привести к утечке памяти. Если настраивается слишком мало потоков, очередь будет продолжать расти больше и потреблять слишком много памяти. * И слишком много потоков замедлит скорость всей системы из -за частых переключений контекста - и будет достигнут тот же конечный результат. Длина очереди имеет решающее значение, она должна быть ограничена, чтобы, если пул резьбов был перегружен, он мог временно отклонить новые запросы. * Реализация исполнителя по умолчанию - неограниченная LinkedBlockingqueue. */ private static treadpoolexecutor executor = new ThreadPoolexeCutor (corePoolsize, corePoolsize+1, 10L, TimeUnit.seconds, новые LinkedBlockqueue <Runnable> (1000)); public static void main (string [] args) бросает прерывание {countdownlatch latch = new Countdownlatch (5); // Использование метода execute executor.execute (new Stats («Задача A», 1000, Latch)); Исполнитель. Исполнитель. Исполнитель. Executor.execute (новая статистика ("Task E", 1000, защелка)); latch.await (); // ждать, пока все задачи по конечному систему. } статическая статистика класса реализует runnable {string statsname; int runtime; Countdownlatch Latch; Public Stats (String StatsName, Int Runtime, CountDownLatch Latch) {this.StatsName = statsName; this.Runtime = время выполнения; this.latch = latch; } public void run () {try {System.out.println (statsName+ "DO Статистика начинается в"+ startTime); // имитировать поток времени выполнения задачи. Sleep (время выполнения); System.out.println (statsname + "Do Статистика завершена At" + sdf.format (new Date ())); latch.countdown (); // заканчивается единственная задача, счетчик уменьшается на один} catch (прерывание Exception e) {e.printstackTrace (); }}}}Метод 2 (будущее)
/*** Многозадачная параллельная + статистика пула потоков* Время создания 17 апреля 2018 г.*/открытый класс Statsdemo {final Static Simpledateformat sdf = new SimpleDateFormat ("yyyy-mm-dd hh: mm: ss"); окончательная статическая строка starttime = sdf.format (new Date ()); / ** * iO-интенсивные задачи = обычно 2 * Количество ядер ЦП (часто в потоках: взаимодействие данных базы данных, загрузка и загрузку файлов, передача сетевых данных и т. Д.) * Задачи с интенсивным процессором = обычно 1 ядра ЦП + 1 (часто в потоках: сложные алгоритмы). Runtime.getRuntime (). Доступный processors (); /*** public ThreadPoolexeCutor (int corepoolSize, int maximumpoolsize, long KeepaliveTime,* TimeUnit Unit, BlockingQueue <Runnable> workqueue)* Corepoolsize используется для указания количества основных потоков* Максимап -lecom Буферная очередь пула потоков, и потоки, которые еще не были выполнены, будут ждать в очереди* Длина очереди монитора, чтобы гарантировать, что ограниченный очередь* Неправильный размер пула резьбы может замедлить скорость обработки, снизить стабильность и привести к утечке памяти. Если настраивается слишком мало потоков, очередь будет продолжать расти больше и потреблять слишком много памяти. * И слишком много потоков замедлит скорость всей системы из -за частых переключений контекста - и будет достигнут тот же конечный результат. Длина очереди имеет решающее значение, она должна быть ограничена, чтобы, если пул резьбов был перегружен, он мог временно отклонить новые запросы. * Реализация исполнителя по умолчанию - неограниченная LinkedBlockingqueue. */ private static treadpoolexecutor executor = new ThreadPoolexeCutor (corePoolsize, corePoolsize+1, 10L, TimeUnit.seconds, новые LinkedBlockqueue <Runnable> (1000)); public static void main (string [] args) бросает прерывание {list <future <String >> resultList = new ArrayList <Future <String >> (); // Использование отправить асинхронную задачу и получить возвращаемое значение в качестве будущего resultlist.add (experator.submit (новая статистика («Задача A», 1000))); resultList.add (experator.submit (new Stats ("Task B", 1000))); resultList.add (experator.submit (new Stats ("Task C", 1000))); ResultList.Add (experator.submit (new Stats ("Task D", 1000))); resultList.add (experator.submit (new Stats ("Task e", 1000))); // Результат задачи обхода для (Future <string> fs: resultList) {try {System.out.println (fs.get ()); // Распечатать результаты выполнения каждой строки, вызовите будущее. } catch (executionException e) {e.printstackTrace (); } наконец {// запустите один раз и выполните ранее представленные задачи, но не принимайте новые задачи. Если он был закрыт, вызов не имеет другого эффекта. Исполнитель.shutdown (); }} System.out.println ("Все статистические задачи выполняются:" + sdf.format (new Date ())); } статический класс статистика реализует Callable <string> {String statsName; int runtime; public Stats (String StatsName, int Runtime) {this.statsName = statSname; this.Runtime = время выполнения; } public String call () {try {System.out.println (statsname+ "do Stats начинается в"+ starttime); // имитировать поток времени выполнения задачи. Sleep (время выполнения); System.out.println (statsname + "Do Статистика завершена At" + sdf.format (new Date ())); } catch (прерванное искусство e) {e.printstacktrace (); } return call (); }}}Время исполнения
Приведенные выше коды представляют собой псевдокоды, и ниже представлены реальные тестовые записи 2000+ студентов.
2018-04-17 17: 42: 29.284 Информационная тест-запись 81E51AB031EB4ADA92743DDF66528D82-SIGN-TREADERED, последовательное выполнение, время, потраченное: 3797
2018-04-17 17: 42: 31.452 Информационно-тест-запись 81E51AB031EB4ADA92743DDF66528D82-MULTI-THREEADERED PARALLEL, время, потраченное: 2167
2018-04-17 17: 42: 33.170 Информационно-тест-запись 81E51AB031EB4ADA92743DDF66528D82-MULTI-THREEDED PARALLEL Задача + Пул потоков, время, потраченное: 1717
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.