Предисловие
В предыдущей серии учебных пособий Spring Boot Basic была представлена статья «Использование @Async для реализации асинхронных вызовов в Spring Boot», как использовать аннотацию @Async для реализации асинхронных вызовов. Тем не менее, контроль над этими асинхронными казнями является нашим основным навыком в обеспечении здоровья наших собственных приложений. В этой статье давайте узнаем, если мы контролируем параллелизм асинхронных вызовов через пользовательские пулы потоков.
Мы можем изменить примеры в этой статье на основе предыдущих примеров или создать новый Spring Boot Project, чтобы попробовать.
Определите пул потоков
Первый шаг - определить пул потоков в основном классе Spring Boot, например:
@SpringBootApplicationPublic Class Application {public static void main (String [] args) {SpringApplication.Run (Application.Class, Args); } @Enableasync @configuration class taskpoolconfig {@bean ("taskexecutor") public executor taskexecutor () {threadpooltaskexecutor executor = new ThreatpooltaskexeCutor (); Исполнитель.setCorePoolsize (10); Исполнитель.setMaxPoolsize (20); Исполнитель.setqueueCapacity (200); Executor.sepekebealiveSeconds (60); Исполнитель.setThreadNamePrefix ("taskexeCutor-"); Исполнитель.setrejectedExecutionHandler (new ThreadPoolexeCutor.callerrunSpolicy ()); вернуть исполнитель; }}}Выше мы создали пул потоков, используя ThreadPooltaskexeCutor, и установили следующие параметры:
Использование пула потоков
После определения пула потоков, как мы делаем асинхронно называемые задачи выполнения выполнения, используя ресурсы в этом пуле потоков? Метод очень прост. Нам просто нужно указать имя пула потоков в аннотации @Async, например:
@Slf4j@componentpublic class task {public static random random = new random (); @Async ("taskexecutor") public void dotaskone () бросает исключение {log.info ("start anding One"); long start = System.currentTimeMillis (); Thread.sleep (random.nextint (10000)); Long End = System.CurrentTimeMillis (); log.info («Полная задача первая, время:« + (end - start) + "миллисекунд"); } @Async ("taskexecutor") public void dotasktwo () бросает exception {log.info ("start task 2"); long start = System.currentTimeMillis (); Thread.sleep (random.nextint (10000)); Long End = System.CurrentTimeMillis (); log.info («Полная задача 2, время взято:« + (end - start) + "миллисекунд"); } @Async ("taskexecutor") public void dotaskThree () бросает exception {log.info ("start task three"); long start = System.currentTimeMillis (); Thread.sleep (random.nextint (10000)); Long End = System.CurrentTimeMillis (); log.info («Полная задача третья, трудоемкая:« + (end - start) + "миллисекунд"); }}ЕДИНЦИОННЫЕ Тестирование
Наконец, давайте напишем модульный тест, чтобы проверить его
@Runwith (springjunit4classrunner.class) @springboottestpublic class applicationtests {@autowired частная задача; @Test public void test () Throws Exception {task.dotaskone (); task.dotasktwo (); task.dotaskthree (); Thread.currentThread (). Join (); }}Выполните приведенный выше модульный тест, мы видим в консоли, что все имена выходных потоков префиксируются пулом потоков, который мы определяли ранее, что означает, что наш эксперимент с использованием пула потоков для выполнения асинхронных задач был успешным!
2018-03-27 22: 01: 15.620 Информация 73703 --- [taskexecutor-1] com.didispace.async.tas
2018-03-27 22: 01: 15.620 Информация 73703 --- [taskexecutor-2] com.didispace.async.task: начало задачи 2
2018-03-27 22: 01: 15.620 Информация 73703 --- [taskexecutor-3] com.didispace.async.tas
2018-03-27 22: 01: 18.165 Информация 73703 --- [taskexecutor-2] com.didispace.async.tas
2018-03-27 22: 01: 22.149 Информация 73703 --- [Taskexecutor-3] com.didispace.async.tas
2018-03-27 22: 01: 23.912 Информация 73703 --- [taskexecutor-1] com.didispace.async.tas
Полный пример:
Читатели могут просмотреть проект главы 4-1-3 в соответствии с их предпочтениями:
Github: https://github.com/dyc87112/springboot-learning/
Gitee: https://gitee.com/diidispace/springboot-learning/
Локальная загрузка: http://xiazai.vevb.com/201805/yuanma/springboot-learning(vevb.com).rar
Суммировать
Вышеуказанное - все содержание этой статьи. Я надеюсь, что содержание этой статьи имеет определенную справочную ценность для каждого обучения или работы. Если у вас есть какие -либо вопросы, вы можете оставить сообщение для общения. Спасибо за поддержку Wulin.com.