springboot 多线程执行
一.springboot开线程执行异步任务
(1).配置类
- package com.yunzhangfang.springboot1.config;
- import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
- import org.springframework.context.annotation.ComponentScan;
- import org.springframework.context.annotation.Configuration;
- import org.springframework.scheduling.annotation.AsyncConfigurer;
- import org.springframework.scheduling.annotation.EnableAsync;
- import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
- import java.util.concurrent.Executor;
- @Configuration
- @ComponentScan("com.yunzhangfang.springboot1.service")
- @EnableAsync
- public class ThreadConfig implements AsyncConfigurer {
- // ThredPoolTaskExcutor的处理流程
- // 当池子大小小于corePoolSize,就新建线程,并处理请求
- // 当池子大小等于corePoolSize,把请求放入workQueue中,池子里的空闲线程就去workQueue中取任务并处理
- // 当workQueue放不下任务时,就新建线程入池,并处理请求,如果池子大小撑到了maximumPoolSize,就用RejectedExecutionHandler来做拒绝处理
- // 当池子的线程数大于corePoolSize时,多余的线程会等待keepAliveTime长时间,如果无请求可处理就自行销毁
- @Override
- public Executor getAsyncExecutor() {
- ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
- executor.setCorePoolSize(5);
- executor.setMaxPoolSize(15);
- executor.setQueueCapacity(25);
- executor.initialize();
- return executor;
- }
- @Override
- public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
- return null;
- }
- }
(2).异步任务
- package com.yunzhangfang.springboot1.service;
- import org.springframework.scheduling.annotation.Async;
- import org.springframework.scheduling.annotation.AsyncResult;
- import org.springframework.stereotype.Service;
- import java.util.concurrent.Future;
- @Service
- public class TaskService {
- @Async
- /**
- * 表明是异步调用
- * 没有返回值
- */
- public void excutVoidTask(int i) {
- System.out.println("异步执行任务第[" + i + "] 个");
- }
- /**
- * 有返回值
- * 异常调用
- *
- * @param i
- * @return
- * @throws InterruptedException
- */
- @Async
- public Future<String> excuteValueTask(int i) throws InterruptedException {
- Thread.sleep(1000);
- Future<String> future = new AsyncResult<String>("success is " + i);
- System.out.println("异步执行任务第[" + i + "] 个");
- return future;
- }
- }
(3).测试异步任务
- package com.yunzhangfang.springboot1;
- import com.yunzhangfang.springboot1.service.TaskService;
- import org.junit.Test;
- import org.junit.runner.RunWith;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.boot.test.context.SpringBootTest;
- import org.springframework.core.task.TaskRejectedException;
- import org.springframework.test.context.junit4.SpringRunner;
- import java.util.ArrayList;
- import java.util.List;
- import java.util.concurrent.ExecutionException;
- import java.util.concurrent.Future;
- @RunWith(SpringRunner.class)
- @SpringBootTest
- public class Springboot1ApplicationTests {
- @Autowired
- private TaskService service;
- @Test
- public void contextLoads() {
- }
- /**
- * 没有返回值测试
- */
- @Test
- public void testVoid() {
- for (int i = 0; i < 20; i++) {
- service.excutVoidTask(i);
- }
- System.out.println("========主线程执行完毕=========");
- }
- @Test
- public void testReturn() throws InterruptedException, ExecutionException {
- List<Future<String>> lstFuture = new ArrayList<>();// 存放所有的线程,用于获取结果
- for (int i = 0; i < 100; i++) {
- while (true) {
- try {
- // 线程池超过最大线程数时,会抛出TaskRejectedException,则等待1s,直到不抛出异常为止
- Future<String> stringFuture = service.excuteValueTask(i);
- lstFuture.add(stringFuture);
- break;
- } catch (TaskRejectedException e) {
- System.out.println("线程池满,等待1S。");
- Thread.sleep(1000);
- }
- }
- }
- // 获取值.get是阻塞式,等待当前线程完成才返回值
- for (Future<String> future : lstFuture) {
- System.out.println(future.get());
- }
- System.out.println("========主线程执行完毕=========");
- }
- }
有错误,希望指出,共同进步,天天向上
springboot 多线程执行的更多相关文章
- (委托事件处理)关于多线程执行显示进度条的实例(转)&&线程间操作无效: 从不是创建控件“rtxtEntryNO”的线程访问它。
关于多线程执行显示进度条的实例! 之前回答了一篇关于怎么在线程中操作进度条的帖子,估计有人看的不是很明白今天没事,写了一个小小的实例,很简单,就2个文件权当抛砖引玉,希望有更好解决方案的人发表一下意见 ...
- C#中 多线程执行含有返回值的函数
C# 中,传统的多线程并不支持多线程执行含有返回结果的函数.虽然可以通过制作外壳类来使得返回结果得以保留,但如果一定时间内函数未执行完,简单的外壳类可能就无法满足需求了. class netHelpe ...
- pthread_create多线程执行顺序诡异现象
多线程执行顺序诡异现象谈,你不知道的pthread_create 引文:学而时习之,不亦说乎.总是忙于具体项目,业务功能的实现:关于编程本身的技能都要有些生疏了,于是就选择了几个专题做了一次温习,重点 ...
- Java 线程和多线程执行过程分析
*/ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...
- selenium+python-unittest多线程执行用例
前言 假设执行一条脚本(.py)用例一分钟,那么100个脚本需要100分钟,当你的用例达到一千条时需要1000分钟,也就是16个多小时...那么如何并行运行多个.py的脚本,节省时间呢?这就用到多线程 ...
- java 中多线程和锁的使用以及获取多线程执行结果
多线程一:原生的写法 关键词 implements 实现 Runnable 类 run() 方法 注意点 : 创建类的实例 InterfaceController inter=new Int ...
- Android-Java控制多线程执行顺序
功能需求: Thread-0线程:打印 1 2 3 4 5 6 Thread-1线程:打印1 1 2 3 4 5 6 先看一个为实现(功能需求的案例) package android.java; // ...
- python--selenium多线程执行用例实例/执行多个用例
python--selenium多线程执行用例实例/执行多个用例 我们在做selenium测试的时候呢,经常会碰到一些需要执行多个用例的情况,也就是多线 程执行py程序,我们前面讲过单个的py用例怎么 ...
- selenium+python自动化90-unittest多线程执行用例
前言 假设执行一条脚本(.py)用例一分钟,那么100个脚本需要100分钟,当你的用例达到一千条时需要1000分钟,也就是16个多小时... 那么如何并行运行多个.py的脚本,节省时间呢?这就用到多线 ...
随机推荐
- Android base-adapter-helper 源码分析与扩展
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/44014941,本文出自:[张鸿洋的博客] 本篇博客是我加入Android 开源项 ...
- MyEclipse代码提示设置
(一)普通代码提示 1. 打开MyEclipse ,然后"window"→"Preferences" 2. 选择"java",展开,&quo ...
- Dreamweaver无法启动:xml parsing fatal error..Designer.xml错误解决方法
xml parsing fatal error:Invalid document structure,line:1,file:C:\Documents and Settings\Administrat ...
- orcl数据库先决条件检查时失败
在服务里面开启下面服务,在cmd输入 services.msc 就能打开[服务] 在cmd输入以下命令 我的是server服务没开,然后开了资源共享,就安装成功了
- BZOJ_1858_[Scoi2010]序列操作_线段树
BZOJ_1858_[Scoi2010]序列操作_线段树 Description lxhgww最近收到了一个01序列,序列里面包含了n个数,这些数要么是0,要么是1,现在对于这个序列有五种变换操作和询 ...
- CentOS7 安装Redis Cluster集群
上一篇中已经讲到了如何安装单击版Redis,这一篇我们来说下如何安装Cluster,关于哨兵模式这里我就不写文章安装了,有兴趣的同学可以自己去研究,哨兵模式可以在主从模式下在创建三台机器的哨兵集群监控 ...
- appium---【已解决】【Mac】from appium import webdriver报错提示“Unresolved import webdriver”
报错提示: from appium import webdriver提示Unresolved import webdriver 报错原因:没有安装Appium_Python_Client 解决办法: ...
- Postman----Presets(预先设置)的使用
使用场景: 当我们在进行接口测试post请求时,headers是必填项,我们将一个A接口的headers编写后测试完成,再次进行B接口的测试,需重新编写headers,为了简单操作,我们就用到了Pre ...
- Appium+python的环境搭建!
我的电脑64位操作系统 下载并安装所需软件: 1.adb环境 2.下载(python-2.7.12.amd64.msi)并安装python 3.下载并解压adt,如(adt-bundle-window ...
- 关于EffictiveC++笔记
我根据自己的理解,对原文的精华部分进行了提炼,并在一些难以理解的地方加上了自己的"可能比较准确"的「翻译」.