spring项目线程池
很多同学在进行编程学习时缺乏系统学习的资料。本页面基于spring项目线程池内容,从基础理论到综合实战,通过实用的知识类文章,标准的编程教程,丰富的视频课程,为您在spring项目线程池相关知识领域提供全面立体的资料补充。同时还包含 safari浏览器、samba、SAMP 的知识内容,欢迎查阅!
spring项目线程池相关知识
-
[开源项目]可观测、易使用的SpringBoot线程池在开发spring boot应用服务的时候,难免会使用到异步任务及线程池。spring boot的线程池是可以自定义的,所以我们经常会在项目里面看到类似于下面这样的代码 @Bean public Executor taskExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setCorePoolSize(config.getCorePoolSize()); executor.setMaxPoolSize(config.getMaxPoolSize()); executor.setQueueCapacity(config.getQueueCapacity()); executor.setThreadNamePrefix("TaskExec
-
美团动态线程池实践思路开源项目(DynamicTp),线程池源码解析及通知告警篇大家好,这篇文章我们来聊下动态线程池开源项目(DynamicTp)的通知告警模块。目前项目提供以下通知告警功能,每一个通知项都可以独立配置是否开启、告警阈值、告警间隔时间、平台等,具体代码请看core模块notify包。 1.核心参数变更通知 2.线程池活跃度告警 3.队列容量告警 4.拒绝策略告警 5.任务执行超时告警 6.任务排队超时告警 DynamicTp项目地址 目前700star,感谢你的star,欢迎pr,业务之余一起给开源贡献一份力量 gitee地址:https://gitee.com/yanhom/dynamic-tp github地址
-
Spring Boot 中的线程池和 Timer 定时器Spring Boot 是一个只写几个配置,就可以完成很多功能的 Java 框架,例如你想要一个线程池,只需两步: 在应用入口 Application 主类上加注解 @EnableScheduling @SpringBootApplication @EnableScheduling public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } } 添加一个线程池配置类,增加 @EnableAsync 注解 @Configuration @EnableAsync public class AsyncConfig { @Value
-
0113 spring定时任务和异步线程池0113 spring的异步方法和定时任务 背景 spring的内容比较多,常规的知识必须进行系统化的学习,但是一些边缘的技术点,在实际工作中也是非常适用的;下面一一介绍和实践一次。 异步线程池 场景:下发任务跟执行任务分开。 比如我需要做一个数据统计。 场景 常规做法 改进做法 计算每天的统计数据,比如日新增,日活跃,日留存等 实时计算,计算和获取结果在同一个线程里完成 分两个部分:1.触发计算;2.异步完成计算; spring中如何实现异步计算 系统中配置异步线程池; 在系统入
spring项目线程池相关课程
spring项目线程池相关教程
- 2.3 线程池 假设您要处理数百个项目,为每个项目启动一个线程将破坏您的系统资源。它看起来像这样:pages_to_crawl = %w( index about contact ... )pages_to_crawl.each do |page| Thread.new { puts page }end如果这样做,您将与服务器启动数百个连接,因此这可能不是一个好主意。一种解决方案是使用线程池。线程池使您可以在任何给定时间控制活动线程的数量。您可以建立自己的池,但是我不建议你这样去做,Ruby有一个Gem可以为您完成这个操作。实例:require 'celluloid'class Worker include Celluloid def process_page(url) puts url endendpages_to_crawl = %w( index about contact products ... )worker_pool = Worker.pool(size: 5)# If you need to collect the return values check out 'futures'pages_to_crawl.each do |page| worker_pool.process_page(page)end这次只有5个线程在运行,完成后他们将选择下一个项目。
- 3. 线程池模型 线程池模型的结构如下:从图中可以看出,线程池模型的程序结构如下:创建一个监听线程,通常会采用 Java 主线程作为监听线程。创建一个 java.net.ServerSocket 实例,调用它的 accept 方法等待客户端的连接。服务器预先创建一组线程,叫做线程池。线程池中的线程,在服务运行过程中,一直运行,不会退出。当有新的客户端和服务器建立连接,accept 方法会返回 java.net.Socket 对象,表示新的连接。服务器一般会创建一个处理 java.net.Socket 逻辑的任务,并且将此任务投递给线程池去处理。然后,监听线程返回,继续调用 accept 方法,等待新的客户端连接。线程池调度空闲的线程去处理任务。在新新任务中调用 java.net.Socket 的 recv 和 send 方法和客户端进行数据收发。当数据收发完成后,调用 java.net.Socket 的 close 方法关闭连接,任务完成。线程重新回归线程池,等待调度。下来,我们同样通过示例代码演示一下线程池模型的编写方法。程序功能和每线程模型完全一致,所以我们只编写服务端程序,客户端程序采用每线程模型的客户端。示例代码如下:import java.io.*;import java.net.ServerSocket;import java.net.Socket;import java.util.concurrent.Callable;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class TCPServerThreadPool{ // 服务监听端口号 private static final int PORT =56002; // 开启线程数 private static final int THREAD_NUMS = 20; private static ExecutorService pool = null; // 创建一个 socket Task 类,处理数据收发 private static class SockTask implements Callable<Void> { private Socket sock = null; public SockTask(Socket sock){ this.sock = sock; } @Override public Void call() throws Exception { try { while (true){ // 读取客户端数据 DataInputStream in = new DataInputStream( new BufferedInputStream(sock.getInputStream())); int msgLen = in.readInt(); byte[] inMessage = new byte[msgLen]; in.read(inMessage); System.out.println("Recv from client:" + new String(inMessage) + "length:" + msgLen); // 向客户端发送数据 String rsp = "Hello Client!\n"; DataOutputStream out = new DataOutputStream( new BufferedOutputStream(sock.getOutputStream())); out.writeInt(rsp.getBytes().length); out.write(rsp.getBytes()); out.flush(); System.out.println("Send to client:" + rsp + " length:" + rsp.getBytes().length); } } catch (IOException e) { e.printStackTrace(); } finally { if (sock != null){ try { sock.close(); } catch (IOException e) { e.printStackTrace(); } } } return null; } } public static void main(String[] args) { ServerSocket ss = null; try { pool = Executors.newFixedThreadPool(THREAD_NUMS); // 创建一个服务器 Socket ss = new ServerSocket(PORT); while (true){ // 监听新的连接请求 Socket conn = ss.accept(); System.out.println("Accept a new connection:" + conn.getRemoteSocketAddress().toString()); pool.submit(new SockTask(conn)); } } catch (IOException e) { e.printStackTrace(); } finally { if (ss != null){ try { ss.close(); } catch (IOException e) { e.printStackTrace(); } } } }}
- 3.1 线程池隔离实现服务资源隔离 通过对处理项目中的工作线程的隔离,来避免工作线程处理接口时所产生的阻塞行为,从而保证工作线程可以顺利地调用接口来满足业务需要。而隔离工作线程的方式,就是为每个接口分配一个线程池,并在线程池中维护一定数量的线程,这样,当上述的接口 2 发生服务资源等待时,由于每个接口都分配了不同的线程池,所以不会影响到后续的 3 4 5 接口,如下图所示:线程池隔离实现原理可以看到,由于为每个服务接口均分配了不同的线程池,所以在接口 2 出现服务等待时,并不会影响后续接口的调用,从而保证了业务的顺利进行。我们继续以 hello 方法为例,来看如何实现线程池隔离。@RequestMapping(value = "hello", method = RequestMethod.GET)@HystrixCommand(threadPoolKey = "HelloHystrix", threadPoolProperties = { @HystrixProperty(name = "coresize", value = "2"), @HystrixProperty(name = "allowMaximumSizeToDivergeFromCoreSize", value = "true"), @HystrixProperty(name = "maximumSize", value = "2"), @HystrixProperty(name = "maxQueueSize", value = "2")})@ResponseBodypublic String hello() throws InterruptedException { return "helloWorld";}代码解释:第 2 行,我们通过配置 HystrixCommand 注解的 threadPoolKey 属性来为本接口分配一个名称为 HelloHystrix 的线程池。第 3 行,我们通过配置 threadPoolProperties 中的参数属性,来维护 HelloHystrix 线程池中的核心线程数量、最大线程数量。通过添加上述注解并配置其中的属性,我们就可以通过线程池隔离的方式来实现服务资源隔离。Tips: 线程池中的线程数量,一定要根据该接口所实现的业务需求来设置,设置过多,则会浪费资源空间,设置过少,则不能支撑业务需要,所以配置线程数量一定要谨慎。
- 3.3 线程池配置模块详解 参数名称:coreSize参数说明:该属性用来设置核心线程池的大小,默认为 10 。参数名称:maximumSize参数说明:该属性是用来设置线程池的最大线程数量,默认为 10 ,在 1.5.9 版本之前,线程池的核心线程数量总是与线程池的最大线程数量保持一致。参数名称:allowMaximumSizeToDivergeFromCoreSize参数说明:该属性是用来设置,是否启用 maximumSize ,即设置线程池的 coreSize 和 maximumSize 的值不一致,当被设置为 true 时,该属性生效,即线程池的最大线程数量大于或等于线程池的核心线程数量。该属性的默认值为 false 。参数名称:keepAliveTimeMinutes参数说明:该参数是用来设置线程的存活时间,即在线程池的核心线程数量小于线程池的最大线程数量时,一个线程的可运行时长。该属性的默认值为 1 分钟。
- 2. 生成 Spring Boot 项目 打开 Spring Initializr 网址 http://start.spring.io ,根据我们项目的情况填入以下信息。Spring Initializr 生成 Spring Boot 项目这是第一次接触 Spring Initializr ,我们来详细了解界面上选项的作用。1. 构建方式选择:此处我们选择 Maven Project 即可,表示生成的项目使用 Maven 构建。当然我们也可以发现,Spring Boot 项目亦可采用 Gradle 构建,目前 Spring Boot 主流的构建方式还是 Maven; 2. 编程语言选择:此处选择 Java 即可; 3. Spring Boot 版本选择: 2.x 版本与 1.x 版本还是有一些区别的,咱们学习肯定是选择 2.x 新版本。此处虽然选择了 2.2.6 版本,但是由于 2.2.6 版本刚推出没多久,国内一些 Maven 仓库尚不支持。后面我们手工改为 2.2.5 版本,便于使用国内 Maven 仓库快速构建项目; 4. 所属机构设置:Group 表示项目所属的机构,就是开发项目的公司或组织。因为公司可能会重名,所以习惯上采用倒置的域名作为 Group 的值。例如慕课网的域名是 imooc.com , 此处写 com.imooc 就行了;5. 项目标识设置:Artifact 是项目标识,用来区分项目。此处我们命名为 spring-boot-hello ,注意项目标识习惯性地采用小写英文单词,单词间加横杠的形式。比如 Spring Boot 官方提供的很多依赖,都是 spring-boot-starter-xxx 的形式;6. 项目名称设置:Name 是项目名称,保持与 Artifact 一致即可; 7. 默认包名设置:Package name 是默认包名,保持默认即可; 8. 打包方式选择:此处选择将项目打包为 Jar 文件; 9. 添加项目依赖:此处不必修改,我们直接在 pom.xml 中添加依赖更加方便。注意 pom.xml 就是 Maven 的配置文件,可以指定我们项目需要引入的依赖; 10. 生成项目:点击 Generate 按钮,即可按我们设置的信息生成 Spring Boot 项目了。
- 3. Spring Boot 项目结构分析 我们将下载的 zip 压缩包解压后导入开发工具,此处以 Eclipse 为例,依次点击 File-Import-Existing Maven Projects ,然后选择解压后的文件夹导入。Eclipse 导入 Spring Boot 项目导入后项目结构如下图,我们逐一分析下他们的用途:Spring Boot 项目结构最外层的 spring-boot-wikis 表示工作集(working set),可以理解为项目分类。我们将 Spring Boot 学习项目都放入该工作集下,便于集中查看;spring-boot-hello 是我们指定的项目名称;src/main/java 是 Java 源代码目录,存放我们编写的 Java 代码;src/main/resources 目录是静态资源目录,存放图片、脚本文件、配置文件等静态资源;src/test/java 目录是测试目录,存放测试类。测试是非常重要的,从目录级别跟源代码同级,就能看出来测试的重要性;target 目录存放我们打包生成的内容;pom.xml 是项目的 Maven 配置文件,指定了项目的基本信息以及依赖项,Maven 就是通过配置文件得知项目构建规则的。Tips: 此处有同学要发问了,不是说好 Spring Boot 没有配置文件吗?不要着急,Spring Boot 可以在没有配置文件时照常运行。但如果需要个性化功能的话,就会用到配置文件了。 Spring Boot 的配置文件使用非常简单,放心就是了!
spring项目线程池相关搜索
-
s line
safari浏览器
samba
SAMP
samplerate
sandbox
sanitize
saper
sas
sass
save
smarty模板
smil
smtp
snapshot
snd
snmptrap
soap
soapclient
soap协议