spring boot 实现配置一个线程池 多线程 并发 操作实例 代码介绍 代码

网友投稿 361 2022-09-07

spring boot 实现配置一个线程池 多线程 并发 操作实例 代码介绍 代码

目录

​​介绍​​

​​1.做一个配置类​​

​​2.应用线程池的类​​

​​3.调用类​​

​​4.启动类​​

​​5.调用测试​​

​​6.日志​​

介绍

完成多线程需要1.一个配置类2.一个调用类3.使用调用类4.调用5.启动6.查看ok

1.做一个配置类

package com.super.conf; import java.util.concurrent.Executor; import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.ComponentScan;import org.springframework.context.annotation.Configuration;import org.springframework.scheduling.annotation.EnableAsync;import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; @Configuration@ComponentScan("com.super.service")@EnableAsyncpublic class ThreadConfig { /** * 执行需要依赖线程池,这里就来配置一个线程池 * * @return */ // 当池子大小小于corePoolSize,就新建线程,并处理请求 // 当池子大小等于corePoolSize,把请求放入workQueue(QueueCapacity)中,池子里的空闲线程就去workQueue中取任务并处理 // 当workQueue放不下任务时,就新建线程入池,并处理请求,如果池子大小撑到了maximumPoolSize,就用RejectedExecutionHandler来做拒绝处理 // 当池子的线程数大于corePoolSize时,多余的线程会等待keepAliveTime长时间,如果无请求可处理就自行销毁 @Bean("getExecutor") public Executor getExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); //设置核心线程数 executor.setCorePoolSize(1000); //设置最大线程数 executor.setMaxPoolSize(10000); //线程池所使用的缓冲队列 executor.setQueueCapacity(7500); //设置线程名 executor.setThreadNamePrefix("service-Async"); //设置多余线程等待的时间,单位:秒 //executor.setKeepAliveSeconds(); // 初始化线程 executor.initialize(); return executor; }}

加上如下注解

@Configuration @ComponentScan("com.supermap.testCtr") @EnableAsync

2.应用线程池的类

package com.super.service;import org.springframework.scheduling.annotation.Async;import org.springframework.stereotype.Service;@Servicepublic class ServiceF { @Async("getExecutor") public void get01() { System.out.println("执行任务1"); } @Async("getExecutor") public void get02() { System.out.println("执行任务2"); } @Async("getExecutor") public Future execute(String req) { return new AsyncResult<>(req); }}

给方法加上@Async("getExecutor")注解,加到类上 就全类的方法都是异步的多线程了有需要可以吧返回的对象更换 int list map  等等

3.调用类

package com.super.clienttest;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.ResponseBody;import com.super.service.ServiceF;@Controllerpublic class AsyncCtr { @Autowired private ServiceF sf; // 无返回值 @RequestMapping("/getfTest") @ResponseBody public void getfTest() { for (int i = 0; i < 100; i++) { sf.get01(); sf.get02(); } } //有返回值可以吧线程池放大些 @RequestMapping("/zszExecute") @ResponseBody public String zszExecute(HttpServletRequest req) { String url = req.getParameter("url") == null ? "" : req.getParameter("url"); Future future = sf.execute(url); return future.get(); }}

4.启动类

package com.supermap;import org.apache.log4j.BasicConfigurator;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import com.supermap.testCtr.InitInif;/** * 项目启动类 * * @author yushen * */@SpringBootApplicationpublic class Provider_App { /** * 项目启动入口 * * @param args */ public static void main(String[] args) { SpringApplication.run(Provider_App.class, args); } }

不用任何修饰

5.调用测试

ip端口 找yml 配置文件看一下是多少就写多少

​​17:04:32.715 INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] - Initializing Spring FrameworkServlet 'dispatcherServlet'2019-06-24 17:04:32.717 INFO org.springframework.web.servlet.DispatcherServlet - FrameworkServlet 'dispatcherServlet': initialization started2019-06-24 17:04:32.721 INFO org.springframework.web.servlet.DispatcherServlet - FrameworkServlet 'dispatcherServlet': initialization completed in 4 ms执行任务2执行任务2执行任务1执行任务1执行任务1执行任务2执行任务2执行任务1执行任务1执行任务1执行任务2执行任务1执行任务2执行任务1执行任务2执行任务1执行任务2执行任务1执行任务2...

好了,现在已经实现异步多线程了他没有按照12,12,12,12 的方式执行及正确了ok

如果有需要也可以使用带返回值的

package com.super.async;import java.util.concurrent.Future;import org.springframework.scheduling.annotation.Async;import org.springframework.scheduling.annotation.AsyncResult;import org.springframework.stereotype.Service;@Servicepublic class serviceI { @Async("getExecutor") public Future getf1() { return new AsyncResult("1"); } @Async("getExecutor") public Future getf2() { return new AsyncResult("1"); }}

public Future getf1() {return new AsyncResult("1");用future 和 asyncResult 实现

jmeter测试

1秒钟轻松支持众多访问

ok

持续更新

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:solr 安装 使用 单机启动 solr云启动 编入索引 搜索索引 规则搜索
下一篇:PR人:全北京好看的姑娘都在这家店排队,但在国外,它正被女孩们抵制!
相关文章

 发表评论

暂时没有评论,来抢沙发吧~