spring配置线程池
很多同学在进行编程学习时缺乏系统学习的资料。本页面基于spring配置线程池内容,从基础理论到综合实战,通过实用的知识类文章,标准的编程教程,丰富的视频课程,为您在spring配置线程池相关知识领域提供全面立体的资料补充。同时还包含 safari浏览器、samba、SAMP 的知识内容,欢迎查阅!
spring配置线程池相关知识
-
Spring Cloud Edgware新特性之二:如何配置Zuul的Hystrix线程池Spring Cloud是当前炙手可热的微服务开发框架。它的功能强大,组件丰富,设计优雅。目前Spring Cloud还在不断发展之中。Spring Cloud即将发布Spring Cloud Edgware 版本。该版本解决了不少Bug,新增了不少新特性,本系列博客将为大家详细阐述在Spring Cloud Edgware中新增的特性。本文为大家讲解如何配置Zuul的Hystrix线程池。TIPS本文中的HystrixThreadPoolKey 跟《Hystrix配置说明( https://github.com/Netflix/Hystrix/wiki/Configuration ) 》中的HystrixThreadPoolKey 是一个东西,如果你不了解HystrixThreadPoolKey ,不了解线程隔离策略,请《详细阅读Hystrix配置说明》。了解这俩术语概念后,再阅读本文,会事半功倍。默认情况下,Zuul的隔离策略是SEMAPHORE 。但一些场景下,我们可能需要将隔离策略改为THREAD
-
Java 线程池配置的常见误区前言 由于线程的创建和销毁对操作系统来说都是比较重量级的操作,所以线程的池化在各种语言内都有实践,当然在 Java 语言中线程池是也非常重要的一部分,有 Doug Lea 大神对线程池的封装,我们使用的时候是非常方便,但也可能会因为不了解其具体实现,对线程池的配置参数存在误解。 我们经常在一些技术书籍或博客上看到,向线程池提交任务时,线程池的执行逻辑如下: 当一个任务被提交后,线程池首先检查正在运行的线程数是否达到核心线程数,如果未达到则创建一个线程。 如果线程池内
-
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配置线程池相关教程
- 3.3 线程池配置模块详解 参数名称:coreSize参数说明:该属性用来设置核心线程池的大小,默认为 10 。参数名称:maximumSize参数说明:该属性是用来设置线程池的最大线程数量,默认为 10 ,在 1.5.9 版本之前,线程池的核心线程数量总是与线程池的最大线程数量保持一致。参数名称:allowMaximumSizeToDivergeFromCoreSize参数说明:该属性是用来设置,是否启用 maximumSize ,即设置线程池的 coreSize 和 maximumSize 的值不一致,当被设置为 true 时,该属性生效,即线程池的最大线程数量大于或等于线程池的核心线程数量。该属性的默认值为 false 。参数名称:keepAliveTimeMinutes参数说明:该参数是用来设置线程的存活时间,即在线程池的核心线程数量小于线程池的最大线程数量时,一个线程的可运行时长。该属性的默认值为 1 分钟。
- 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: 线程池中的线程数量,一定要根据该接口所实现的业务需求来设置,设置过多,则会浪费资源空间,设置过少,则不能支撑业务需要,所以配置线程数量一定要谨慎。
- 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(); } } } }}
- 2. Hystrix 其他配置项概览 结合 Hystrix 官网给出的说明,Hystrix 的其他配置项可分为 3 大模块,它们分别是公共配置模块、命令合并配置模块、线程池配置模块。在这三大模块中,命令合并配置模块、线程池配置模块下没有其他的子项配置内容,也就是说,命令合并配置模块下,所有的配置项都只配置命令合并;线程池配置模块下,所有的配置项都只对线程池进行配置。而公共配置模块中就包含了很多子项的配置,它们的关系如下图所示:Hystrix 公共配置模块概览在这三个模块中,我会挑选其中常用的属性参数来为大家介绍,至于那些在实际工作中很少用或者基本使用不到的属性,这里就不做介绍了。
- 2.1 关于参数配置的坑 我们在 Spring Cloud 中使用 Hystrix 时,一般会通过 HystrixCommand 注解去配置我们的 Hystrix 的各个配置参数,这个坑就出现在我们对线程池隔离所配置时,由于我们把线程池隔离的属性的值都设置为了 1 ,导致配置有时候不会生效,详见下方代码:threadPoolProperties = { @HystrixProperty(name = "coreSize", value = "1"), @HystrixProperty(name = "maxQueueSize", value = "1"), @HystrixProperty(name = "queueSizeRejectionThreshold", value = "1")}如果像上述代码段中那样进行配置,那么 threadPoolProperties 就不会生效,所以,各位同学在编码的时候,可以适当把上述参数的值设置的大一些,比如将上述参数的值都扩大 10 倍:threadPoolProperties = { @HystrixProperty(name = "coreSize", value = "10"), @HystrixProperty(name = "maxQueueSize", value = "10"), @HystrixProperty(name = "queueSizeRejectionThreshold", value = "10")}设置成这样的话,无论怎么测试,threadPoolProterties 都是生效的。
spring配置线程池相关搜索
-
s line
safari浏览器
samba
SAMP
samplerate
sandbox
sanitize
saper
sas
sass
save
smarty模板
smil
smtp
snapshot
snd
snmptrap
soap
soapclient
soap协议