一.springboot开线程执行异步任务

1.Spring通过任务执行器TaskExecutor,来实现多线程和并发编程,使用ThreadPoolTaskExecutor可实现一个基于线程池的TaskExecutor;
2.异步需要在配置类上面加@EnableAsync 来开启对异步任务的支持在需要异步执行的方法上面加@Async 来声明这个方法是一个需要异步执行的方法;
3.让配置类实现AsyncConfigurer接口,并重写getAsyncExecutor方法,并返回一个ThreasPoolTaskExecutor,就可以获取一个基于线程池的TaskExecutor;
4.@Async 用在方法上,表示这个方法是一个异步的方法,如果用在类上面,表明这个类中的所有方法都是异步的方法。

(1).配置类

  1. package com.yunzhangfang.springboot1.config;
  2.  
  3. import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
  4. import org.springframework.context.annotation.ComponentScan;
  5. import org.springframework.context.annotation.Configuration;
  6. import org.springframework.scheduling.annotation.AsyncConfigurer;
  7. import org.springframework.scheduling.annotation.EnableAsync;
  8. import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
  9.  
  10. import java.util.concurrent.Executor;
  11.  
  12. @Configuration
  13. @ComponentScan("com.yunzhangfang.springboot1.service")
  14. @EnableAsync
  15. public class ThreadConfig implements AsyncConfigurer {
  16.  
  17. // ThredPoolTaskExcutor的处理流程
  18. // 当池子大小小于corePoolSize,就新建线程,并处理请求
  19. // 当池子大小等于corePoolSize,把请求放入workQueue中,池子里的空闲线程就去workQueue中取任务并处理
  20. // 当workQueue放不下任务时,就新建线程入池,并处理请求,如果池子大小撑到了maximumPoolSize,就用RejectedExecutionHandler来做拒绝处理
  21. // 当池子的线程数大于corePoolSize时,多余的线程会等待keepAliveTime长时间,如果无请求可处理就自行销毁
  22. @Override
  23. public Executor getAsyncExecutor() {
  24. ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
  25. executor.setCorePoolSize(5);
  26. executor.setMaxPoolSize(15);
  27. executor.setQueueCapacity(25);
  28. executor.initialize();
  29. return executor;
  30. }
  31.  
  32. @Override
  33. public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
  34. return null;
  35. }
  36.  
  37. }

(2).异步任务

  1. package com.yunzhangfang.springboot1.service;
  2.  
  3. import org.springframework.scheduling.annotation.Async;
  4. import org.springframework.scheduling.annotation.AsyncResult;
  5. import org.springframework.stereotype.Service;
  6.  
  7. import java.util.concurrent.Future;
  8.  
  9. @Service
  10. public class TaskService {
  11.  
  12. @Async
  13. /**
  14. * 表明是异步调用
  15. * 没有返回值
  16. */
  17. public void excutVoidTask(int i) {
  18. System.out.println("异步执行任务第[" + i + "] 个");
  19. }
  20.  
  21. /**
  22. * 有返回值
  23. * 异常调用
  24. *
  25. * @param i
  26. * @return
  27. * @throws InterruptedException
  28. */
  29. @Async
  30. public Future<String> excuteValueTask(int i) throws InterruptedException {
  31. Thread.sleep(1000);
  32. Future<String> future = new AsyncResult<String>("success is " + i);
  33. System.out.println("异步执行任务第[" + i + "] 个");
  34. return future;
  35. }
  36.  
  37. }

(3).测试异步任务

  1. package com.yunzhangfang.springboot1;
  2.  
  3. import com.yunzhangfang.springboot1.service.TaskService;
  4. import org.junit.Test;
  5. import org.junit.runner.RunWith;
  6. import org.springframework.beans.factory.annotation.Autowired;
  7. import org.springframework.boot.test.context.SpringBootTest;
  8. import org.springframework.core.task.TaskRejectedException;
  9. import org.springframework.test.context.junit4.SpringRunner;
  10.  
  11. import java.util.ArrayList;
  12. import java.util.List;
  13. import java.util.concurrent.ExecutionException;
  14. import java.util.concurrent.Future;
  15.  
  16. @RunWith(SpringRunner.class)
  17. @SpringBootTest
  18. public class Springboot1ApplicationTests {
  19.  
  20. @Autowired
  21. private TaskService service;
  22.  
  23. @Test
  24. public void contextLoads() {
  25. }
  26.  
  27. /**
  28. * 没有返回值测试
  29. */
  30. @Test
  31. public void testVoid() {
  32. for (int i = 0; i < 20; i++) {
  33. service.excutVoidTask(i);
  34. }
  35. System.out.println("========主线程执行完毕=========");
  36. }
  37.  
  38. @Test
  39. public void testReturn() throws InterruptedException, ExecutionException {
  40. List<Future<String>> lstFuture = new ArrayList<>();// 存放所有的线程,用于获取结果
  41. for (int i = 0; i < 100; i++) {
  42. while (true) {
  43. try {
  44. // 线程池超过最大线程数时,会抛出TaskRejectedException,则等待1s,直到不抛出异常为止
  45. Future<String> stringFuture = service.excuteValueTask(i);
  46. lstFuture.add(stringFuture);
  47. break;
  48. } catch (TaskRejectedException e) {
  49. System.out.println("线程池满,等待1S。");
  50. Thread.sleep(1000);
  51. }
  52. }
  53. }
  54.  
  55. // 获取值.get是阻塞式,等待当前线程完成才返回值
  56. for (Future<String> future : lstFuture) {
  57. System.out.println(future.get());
  58. }
  59.  
  60. System.out.println("========主线程执行完毕=========");
  61. }
  62.  
  63. }

有错误,希望指出,共同进步,天天向上

springboot 多线程执行的更多相关文章

  1. (委托事件处理)关于多线程执行显示进度条的实例(转)&&线程间操作无效: 从不是创建控件“rtxtEntryNO”的线程访问它。

    关于多线程执行显示进度条的实例! 之前回答了一篇关于怎么在线程中操作进度条的帖子,估计有人看的不是很明白今天没事,写了一个小小的实例,很简单,就2个文件权当抛砖引玉,希望有更好解决方案的人发表一下意见 ...

  2. C#中 多线程执行含有返回值的函数

    C# 中,传统的多线程并不支持多线程执行含有返回结果的函数.虽然可以通过制作外壳类来使得返回结果得以保留,但如果一定时间内函数未执行完,简单的外壳类可能就无法满足需求了. class netHelpe ...

  3. pthread_create多线程执行顺序诡异现象

    多线程执行顺序诡异现象谈,你不知道的pthread_create 引文:学而时习之,不亦说乎.总是忙于具体项目,业务功能的实现:关于编程本身的技能都要有些生疏了,于是就选择了几个专题做了一次温习,重点 ...

  4. Java 线程和多线程执行过程分析

    */ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...

  5. selenium+python-unittest多线程执行用例

    前言 假设执行一条脚本(.py)用例一分钟,那么100个脚本需要100分钟,当你的用例达到一千条时需要1000分钟,也就是16个多小时...那么如何并行运行多个.py的脚本,节省时间呢?这就用到多线程 ...

  6. java 中多线程和锁的使用以及获取多线程执行结果

    多线程一:原生的写法   关键词 implements  实现  Runnable 类 run()  方法 注意点 : 创建类的实例 InterfaceController inter=new Int ...

  7. Android-Java控制多线程执行顺序

    功能需求: Thread-0线程:打印 1 2 3 4 5 6 Thread-1线程:打印1 1 2 3 4 5 6 先看一个为实现(功能需求的案例) package android.java; // ...

  8. python--selenium多线程执行用例实例/执行多个用例

    python--selenium多线程执行用例实例/执行多个用例 我们在做selenium测试的时候呢,经常会碰到一些需要执行多个用例的情况,也就是多线 程执行py程序,我们前面讲过单个的py用例怎么 ...

  9. selenium+python自动化90-unittest多线程执行用例

    前言 假设执行一条脚本(.py)用例一分钟,那么100个脚本需要100分钟,当你的用例达到一千条时需要1000分钟,也就是16个多小时... 那么如何并行运行多个.py的脚本,节省时间呢?这就用到多线 ...

随机推荐

  1. Android base-adapter-helper 源码分析与扩展

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/44014941,本文出自:[张鸿洋的博客] 本篇博客是我加入Android 开源项 ...

  2. MyEclipse代码提示设置

    (一)普通代码提示 1. 打开MyEclipse ,然后"window"→"Preferences" 2. 选择"java",展开,&quo ...

  3. Dreamweaver无法启动:xml parsing fatal error..Designer.xml错误解决方法

    xml parsing fatal error:Invalid document structure,line:1,file:C:\Documents and Settings\Administrat ...

  4. orcl数据库先决条件检查时失败

    在服务里面开启下面服务,在cmd输入 services.msc 就能打开[服务] 在cmd输入以下命令 我的是server服务没开,然后开了资源共享,就安装成功了

  5. BZOJ_1858_[Scoi2010]序列操作_线段树

    BZOJ_1858_[Scoi2010]序列操作_线段树 Description lxhgww最近收到了一个01序列,序列里面包含了n个数,这些数要么是0,要么是1,现在对于这个序列有五种变换操作和询 ...

  6. CentOS7 安装Redis Cluster集群

    上一篇中已经讲到了如何安装单击版Redis,这一篇我们来说下如何安装Cluster,关于哨兵模式这里我就不写文章安装了,有兴趣的同学可以自己去研究,哨兵模式可以在主从模式下在创建三台机器的哨兵集群监控 ...

  7. appium---【已解决】【Mac】from appium import webdriver报错提示“Unresolved import webdriver”

    报错提示: from appium import webdriver提示Unresolved import webdriver 报错原因:没有安装Appium_Python_Client 解决办法: ...

  8. Postman----Presets(预先设置)的使用

    使用场景: 当我们在进行接口测试post请求时,headers是必填项,我们将一个A接口的headers编写后测试完成,再次进行B接口的测试,需重新编写headers,为了简单操作,我们就用到了Pre ...

  9. Appium+python的环境搭建!

    我的电脑64位操作系统 下载并安装所需软件: 1.adb环境 2.下载(python-2.7.12.amd64.msi)并安装python 3.下载并解压adt,如(adt-bundle-window ...

  10. 关于EffictiveC++笔记

    我根据自己的理解,对原文的精华部分进行了提炼,并在一些难以理解的地方加上了自己的"可能比较准确"的「翻译」.