springboot主线程_Springboot对多线程的支持详解

Springboot对多线程的支持详解

这两天看阿里的JAVA开发手册,到多线程的时候说永远不要用 new Thread()这种方式来使用多线程。确实是这样的,我一直在用线程池,到了springboot才发现他已经给我们提供了很方便的线程池机制。

本博客代码托管在github上https://github.com/gxz0422042...

一、介绍

Spring是通过任务执行器(TaskExecutor)来实现多线程和并发编程,使用ThreadPoolTaskExecutor来创建一个基于线城池的TaskExecutor。在使用线程池的大多数情况下都是异步非阻塞的。我们配置注解@EnableAsync可以开启异步任务。然后在实际执行的方法上配置注解@Async上声明是异步任务。

二、配置类

配置类代码如下:

package com.spartajet.springbootlearn.thread;

import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;

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;

/**

* @description

* @create 2017-02-22 下午11:53

* @email gxz04220427@163.com

*/

@Configuration

@EnableAsync

public class ThreadConfig implements AsyncConfigurer {

/**

* The {@link Executor} instance to be used when processing async

* method invocations.

*/

@Override

public Executor getAsyncExecutor() {

ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();

executor.setCorePoolSize(5);

executor.setMaxPoolSize(15);

executor.setQueueCapacity(25);

executor.initialize();

return executor;

}

/**

* The {@link AsyncUncaughtExceptionHandler} instance to be used

* when an exception is thrown during an asynchronous method execution

* with {@code void} return type.

*/

@Override

public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {

return null;

}

}

解读:

利用EnableAsync来开启Springboot对于异步任务的支持

配置类实现接口AsyncConfigurator,返回一个ThreadPoolTaskExecutor线程池对象。

三、任务执行

任务执行代码:

package com.spartajet.springbootlearn.thread;

import org.springframework.scheduling.annotation.Async;

import org.springframework.stereotype.Service;

/**

* @description

* @create 2017-02-23 上午12:00

* @email gxz04220427@163.com

*/

@Service

public class AsyncTaskService {

@Async

public void executeAsyncTask(int i) {

System.out.println("线程" + Thread.currentThread().getName() + " 执行异步任务:" + i);

}

}

代码解读:

通过@Async注解表明该方法是异步方法,如果注解在类上,那表明这个类里面的所有方法都是异步的。

四、测试代码

package com.spartajet.springbootlearn;

import com.spartajet.springbootlearn.thread.AsyncTaskService;

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.test.context.junit4.SpringRunner;

@RunWith (SpringRunner.class)

@SpringBootTest

public class SpringbootLearnApplicationTests {

@Autowired

private AsyncTaskService asyncTaskService;

@Test

public void contextLoads() {

}

@Test

public void threadTest() {

for (int i = 0; i < 20; i++) {

asyncTaskService.executeAsyncTask(i);

}

}

}

测试结果:

线程ThreadPoolTaskExecutor-4 执行异步任务:3

线程ThreadPoolTaskExecutor-2 执行异步任务:1

线程ThreadPoolTaskExecutor-1 执行异步任务:0

线程ThreadPoolTaskExecutor-1 执行异步任务:7

线程ThreadPoolTaskExecutor-1 执行异步任务:8

线程ThreadPoolTaskExecutor-1 执行异步任务:9

线程ThreadPoolTaskExecutor-1 执行异步任务:10

线程ThreadPoolTaskExecutor-5 执行异步任务:4

线程ThreadPoolTaskExecutor-3 执行异步任务:2

线程ThreadPoolTaskExecutor-5 执行异步任务:12

线程ThreadPoolTaskExecutor-1 执行异步任务:11

线程ThreadPoolTaskExecutor-2 执行异步任务:6

线程ThreadPoolTaskExecutor-4 执行异步任务:5

线程ThreadPoolTaskExecutor-2 执行异步任务:16

线程ThreadPoolTaskExecutor-1 执行异步任务:15

线程ThreadPoolTaskExecutor-5 执行异步任务:14

线程ThreadPoolTaskExecutor-3 执行异步任务:13

线程ThreadPoolTaskExecutor-1 执行异步任务:19

线程ThreadPoolTaskExecutor-2 执行异步任务:18

线程ThreadPoolTaskExecutor-4 执行异步任务:17

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/244600.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

信号灯文件锁linux线程,linux——线程同步(互斥量、条件变量、信号灯、文件锁)...

一、说明linux的线程同步涉及&#xff1a;1、互斥量2、条件变量3、信号灯4、文件读写锁信号灯很多时候被称为信号量&#xff0c;但个人仍觉得叫做信号灯比较好&#xff0c;因为可以与“SYSTEM V IPC的信号量”相区分(如有不同意见&#xff0c;欢迎探讨)。二、互斥量1、定义互斥…

wpf 大数据界面_24小时删!WPF 界面开发可视化数据源500行代码分享

通过DevExpress WPF Controls&#xff0c;您能创建有着强大互动功能的XAML基础应用程序&#xff0c;这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。在本教程中&#xff0c;您将完成可视化数据源所需的步骤。应该执行以下步骤&#xff0c;本文我们将为大…

反向题在测试问卷信效度_(完整版)问卷信度效度检验

从统计数据质量角度谈调查问卷的设计质量一、引言从保证统计数据质量的统计工作过程看&#xff0c;统计数据质量可以被划分为统计设计质量、统计调查质量、统计整理质量、统计分析质量以及数据发布传输质量等。统计设计质量是保证统计数据质量的首要环节&#xff0c;在统计数据…

朋友圈加粗字体数字_数字+符码:医院数码导视系统畅想起来

(建筑平面设计图边缘有横竖轴线编码)医院导视系统要做到最简单、最清晰的表达&#xff0c;和谐地融入室内环境并具有一定的弹性&#xff0c;能够适应变化&#xff0c;并适应未来科技的发展&#xff0c;接纳信息化&#xff0c;与管理、服务互联互通。文 | 谷 建 中衡设计集团股…

linux用光盘作yum源实验步骤,Linux使用系统光盘作为YUM源

CentOS 使用方法挂载光盘Linux代码# mkdir /media/cdrom# mount /dev/cdrom /media/cdromyum源文件说明在 /etc/yum.repos.d/ 目录中有CentOS-Base.repo和CentOS-Media.repo两个文件CentOS-Base.repo 记录的是网络上的资源信息CentOS-Media.repo 记录的光盘上的资源信息&#x…

苹果x出现绿线怎么修复_苹果x听筒声音小,苹果x通话声音小怎么办

苹果x听筒声音小&#xff0c;苹果x通话声音小怎么办?相信使用苹果x手机的人大多都会遇见这类情况吧。iPhone手机出现听筒声音小的现象&#xff0c;首先我们要确定出现听筒声音小的故障原因是什么&#xff0c;如果是软件方面的原因造成的&#xff0c;就可以自己调试解决&#x…

wxpython输入框_基于wxPython的GUI实现输入对话框(1)

本文实例为大家分享了基于wxpython的gui实现输入对话框的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下编程时,免不了要输入一些参数等,这时输入对话框就派上用处了:#-*- coding:utf-8 -*-#~ #-------------------------------------------------------------------…

linux grep -11,11个高级Linux字符类和括号表达式的grep命令

你是否曾经在你需要的一种局面搜索字符串&#xff0c;文字或图案的文件里面呢&#xff1f; 如果是&#xff0c;那么grep工具来在这样的情况下派上用场。grep的是为其匹配一个正则表达式搜索行纯文本数据的命令行实用程序。 如果您将分词的grep如 g/re/p&#xff0c;然后grep的含…

tortoisegitpull 并合_tortoiseGIT 本地分支创建合并

接下来是使用tortoiseGIT二、图解使用tortoiseGIT这里只是做一些最基本的功能的演示&#xff1a;创建版本库&#xff0c;提交(commit)文件&#xff0c;推送(push)文件&#xff0c;更新文件&#xff0c;创建分支。简介&#xff1a;git属于分布式版本控制器&#xff0c;其实每个人…

视频图像处理平台对比_对比传统智能结算,戈子视觉结算有了质的改变

相比于使用的RFID原理技术的传统智能结算台&#xff0c;戈子视觉结算台使用的是由戈子科技自主研发的视觉结算系统&#xff0c;其采用的是图像处理技术&#xff0c;通过对餐具扫描识别进行结算。相比于传统智能结算台&#xff0c;其在功能上有很大的提升与创新。戈子视觉结算系…

C语言中字符型和浮点型能否相加,C语言中数据结构的基本类型(整型、浮点型和字符型)...

#include int main(){/**********************************************************// 我们列出的是VS2008的内存占用情况// 一、整型变量的分类&#xff1a;// 1&#xff0c;基本整型&#xff0c;以int表示// 2&#xff0c;短整型&#xff0c;以short int表示&#xff0c;或以…

vs code linux opencv,ubuntu+vscode 测试运行opencv

ubuntuvscode 测试运行opencvubuntuvscode 测试运行opencv之前再ubuntu配置好了opencv,今天测试运行一下。1.创建一个文件夹opencvtest2.在文件夹内打开终端&#xff0c;创建一个cpp文件&#xff0c;再放一张图片。touch mian.cpp3.vim或者文本管理器打开 复制好程序vim命令&am…

wp自定义帖子没标签_拼多多搜索智能推广和自定义推广区别在哪里?

大家好我是牧童&#xff0c;商家在开多多搜索的时候&#xff0c;会发现推广方案中有个智能推广以及自定义推广&#xff0c;很多商家不知道该如何选择&#xff0c;然后就两个计划都建了。之后会发现有的时候智能推广的数据要比自定义推广好&#xff0c;但有的时候智能推广的数据…

python sort 部分元素_Python 简单排序算法-选择、冒泡、插入排序实现

写文章主要是记录自己每天学习的东西&#xff0c;本篇文章主要介绍数据结构中常用的简单的排序算法&#xff0c;虽然这些算法用Python实现起来不是十分的高效&#xff0c;不如c、java之类的运行速度快&#xff0c;应用Python实现主要是为了&#xff1a;1、证明我已经理解了这些…

numpy安装_Python进阶之NumPy快速入门(一)

前言NumPy是Python的一个扩展库&#xff0c;负责数组和矩阵运行。相较于传统Python&#xff0c;NumPy运行效率高&#xff0c;速度快&#xff0c;是利用Python处理数据必不可少的工具。这个NumPy快速入门系列分为四篇&#xff0c;包含了NumPy大部分基础知识&#xff0c;每篇阅读…

gc java root_聊聊Java的GC机制

原标题&#xff1a;聊聊Java的GC机制近日&#xff0c;MIUI在小米全球社区发布公告&#xff0c;表示MIUI将在全球市场销售的手机中预装谷歌拨号及谷歌消息应用程序(中国、印度、印度尼西亚等市场除外)。小米表示&#xff0c;小米9T Pro之后的设备在全球范围内都将会预装上述两款…

c语言课程设计 第2版,c语言课程设计报告模版(电子版)2.pdf

c语言课程设计报告模版(电子版)2大连交通大学 软件学院 C语言课程设计报告SOFTWARE INSTITUTEOF DALIAN JIAOTONG UNIVERSITY EXPERIMENT DESIGNINGC语言课程设计报告Course Design reporter课程名称 &#xff1a; C语言课程设计英文名称 : Course Design of C Programming专 业…

jmeter跨线程组传多个值_Jmeter 跨线程组传递参数 之两种方法(转)

终于搞定了Jmeter跨线程组之间传递参数&#xff0c;这样就不用每次发送请求B之前&#xff0c;都需要同时发送一下登录接口(因为同一个线程组下的请求是同时发送的)&#xff0c;只需要发送一次登录请求&#xff0c;请求B直接用登录请求的参数即可&#xff0c;直到登录接口的参数…

wallpaper代码_70 行 python 代码实现壁纸批量下载!

好久没有写文章了&#xff0c;因为最近都在适应新的岗位&#xff0c;以及利用闲暇时间学习python。这篇文章是最近的一个python学习阶段性总结&#xff0c;开发了一个爬虫批量下载某壁纸网站的高清壁纸。注意&#xff1a;本文所属项目仅用于python学习&#xff0c;严禁作为其他…

c语言调用go函数,C中调用go中的回调函数

在用go包装某些c库时(如glut)&#xff0c;需要将go函数当作回调函数传递给c库(如glutDisplayFunc(&draw)中的draw函数&#xff0c;我想将go写的函数传过去)&#xff0c;应该怎么做&#xff1f;我写了一个示例&#xff0c;但一直不成功&#xff0c;不知道为什么&#xff1f;…