当前位置: 首页 > wzjs >正文

网站审批号开发一套app要多少钱

网站审批号,开发一套app要多少钱,无锡公司网站建设服务,婚庆类网站模板这里写目录标题 一、设定线程池的参数1. 核心线程数(corePoolSize)2. 最大线程数(maximumPoolSize)3. 队列大小(workQueue)4. 线程空闲存活时间(keepAliveTime)5. 线程池拒绝策略&am…

这里写目录标题

  • 一、设定线程池的参数
      • 1. 核心线程数(corePoolSize)
      • 2. 最大线程数(maximumPoolSize)
      • 3. 队列大小(workQueue)
      • 4. 线程空闲存活时间(keepAliveTime)
      • 5. 线程池拒绝策略(RejectedExecutionHandler)
  • 二、动态获取线程池的参数
      • 1.监控线程池的关键指标
      • 2. 使用 Prometheus + Grafana 监控线程池
      • 3. 监控线程池的优化建议
  • 三、动态调整线程池的方式(手动/自动)
      • 1. 通过 `ThreadPoolExecutor` 运行时调整,结合 `ScheduledExecutorService` 定期调整
      • 2. 结合 JMX(Java Management Extensions)远程管理
      • 3. 通过 Spring Boot Actuator 结合 Nacos / Apollo 配置中心
      • 4. 结合业务流量监控自适应调整

一、设定线程池的参数

程池的核心参数主要有以下几个:

  • corePoolSize:核心线程数,线程池中常驻的线程数量。
  • maximumPoolSize:最大线程数,线程池允许创建的最大线程数量。
  • workQueue:任务队列,用于存放待执行的任务。
  • keepAliveTime:非核心线程的空闲存活时间。
  • threadFactory:线程工厂,用于创建线程。
  • handler:拒绝策略,当任务无法处理时的处理方式。

其中,corePoolSize、maximumPoolSize和workQueue参数较为重要。对于线上线程池参数的设置需要综合考虑业务需求、服务器资源和性能优化,主要涉及以下几个关键参数:


1. 核心线程数(corePoolSize)

  • 设置原则:一般根据经验值来的。
    • CPU 密集型任务(计算任务):核心线程数 ≈ CPU核心数+1。这是因为计算过程中 CPU 一直处于高负载状态,线程几乎不会因为等待 I/O 而阻塞。过多的线程会导致线程上下文切换,降低性能。
    • IO 密集型任务(网络/数据库访问):核心线程数 ≈ CPU 核心数 * 2 或者基于吞吐量测试调整。线程在 I/O 操作期间会被阻塞,CPU 处于空闲状态,等待 I/O 完成后才能继续执行。因此,需要更多的线程来提高 CPU 利用率,让线程在等待 I/O 时,其他线程可以继续执行任务

2. 最大线程数(maximumPoolSize)

  • 设置原则
    • 当任务量激增,超过核心线程数时,线程池会创建新线程,但不会超过 maximumPoolSize。不应超过 服务器 CPU 核心数的 2~4 倍,否则会导致过多线程竞争 CPU,增加上下文切换开销。

3. 队列大小(workQueue)

  • 队列作用
    • 当线程数达到 corePoolSize 后,新任务进入等待队列
    • 只有当队列满时,才会创建新的线程(最多 maximumPoolSize 个)
  • 队列选择
    • 无界队列(LinkedBlockingQueue)
      • 适用于任务数不稳定但不会无限增长的情况
      • 风险:队列过长可能导致 OOM(内存溢出)
    • 有界队列(ArrayBlockingQueue)
      • 限制队列长度,避免 OOM
      • 适用于稳定的业务流量
    • SynchronousQueue(直接提交策略)
      • 任务不入队列,直接提交给线程池
      • 适用于要求极低延迟、高吞吐量的场景(但可能造成任务丢失)

4. 线程空闲存活时间(keepAliveTime)

  • 作用
    • 当线程池中的线程数量超过 corePoolSize,并且线程空闲时间超过 keepAliveTime,这些多余的线程会被回收
  • 设置建议
    • CPU 密集型任务:可以适当设置较短(如 30s)
    • IO 密集型任务:可以适当设置较长(如 60s)
    • 任务频繁变化的场景:可以动态调整,避免频繁创建销毁线程

5. 线程池拒绝策略(RejectedExecutionHandler)

  • 常见策略
    • AbortPolicy(默认):直接抛出 RejectedExecutionException,适用于严格不允许丢任务的场景。
    • CallerRunsPolicy:让提交任务的线程自己执行该任务,适用于降低任务提交速率。
    • DiscardPolicy:直接丢弃任务,不抛异常(适用于不重要任务)。
    • DiscardOldestPolicy:丢弃队列中最老的任务(适用于实时性高的任务)。
  • 建议
    • 高并发场景下,避免使用默认 AbortPolicy,可使用 CallerRunsPolicy 保护系统

二、动态获取线程池的参数

上述在实际生产环境中,根据经验值设定线程池参数的静态配置往往无法满足业务的动态变化需求,因此需要采用动态调整策略,以提高系统的吞吐量和稳定性。以下是几种常见的动态调整方式:


1.监控线程池的关键指标

在实际生产环境中,监控线程池的运行状态可以帮助我们发现线程过载、任务积压、资源消耗过大等问题,从而优化线程池的参数配置。以下是需要重点监控的关键指标*。

指标名称描述异常情况分析
活跃线程数 (getActiveCount())当前正在执行任务的线程数过高可能表示任务负载大,线程池可能不足
核心线程数 (getCorePoolSize())线程池的最小线程数应根据任务类型(CPU 密集/I/O 密集)设定
最大线程数 (getMaximumPoolSize())线程池的最大线程数过高可能导致 CPU 争抢资源、线程切换过多
当前线程数 (getPoolSize())线程池中当前线程的总数过多时可能导致内存占用过高
任务队列大小 (getQueue().size())当前排队等待的任务数过大可能表示任务处理过慢,队列可能需要扩展
任务总数 (getTaskCount())线程池接收到的任务总数反映业务处理总量
已完成任务数 (getCompletedTaskCount())线程池已执行完成的任务数低于 getTaskCount() 可能表示有任务积压
拒绝任务数(自定义统计)由于线程池满载被拒绝的任务数过高可能意味着 maximumPoolSize 过小或队列太小
平均任务执行时间(需要额外统计)任务平均执行时间过长可能表示单个任务耗时较长
CPU 使用率(JVM 级别)当前 CPU 占用率过高可能意味着线程池线程数过多
内存使用率(JVM 级别)线程池占用的内存过高可能会触发 OOM(OutOfMemoryError)

2. 使用 Prometheus + Grafana 监控线程池

在微服务环境下,我们通常使用 Prometheus + Grafana 采集和展示线程池监控数据。

  1. 引入 Micrometer 依赖
<dependency><groupId>io.micrometer</groupId><artifactId>micrometer-core</artifactId><version>1.8.2</version>
</dependency>
<dependency><groupId>io.micrometer</groupId><artifactId>micrometer-registry-prometheus</artifactId><version>1.8.2</version>
</dependency>
  1. 绑定线程池到 Prometheus
MeterRegistry registry = new PrometheusMeterRegistry(PrometheusConfig.DEFAULT);
ThreadPoolExecutor executor = new ThreadPoolExecutor(8, 16, 30, TimeUnit.SECONDS, new LinkedBlockingQueue<>(100));registry.gauge("thread_pool_active_threads", executor, ThreadPoolExecutor::getActiveCount);
registry.gauge("thread_pool_queue_size", executor, e -> e.getQueue().size());
registry.gauge("thread_pool_completed_tasks", executor, ThreadPoolExecutor::getCompletedTaskCount);

然后在 Grafana 中创建仪表盘,查看线程池的活跃线程数、任务队列大小、已完成任务数等信息。

3. 监控线程池的优化建议

  1. 活跃线程数长期接近 maximumPoolSize

    • 可能表示线程池过载,可以增加 maximumPoolSize优化任务执行时间
  2. 任务队列过大

    • 可能表示消费速度慢,可以考虑:
      • 增加 maximumPoolSize(适用于 I/O 密集型任务)。
      • 优化单个任务的执行效率
  3. 拒绝任务过多

    • 可能表示队列满、线程池资源不足,可以调整:
      • 增加 maximumPoolSize
      • 优化任务提交逻辑(例如限流)
  4. CPU 利用率过高

    • 可能表示线程数过多导致上下文切换,需要适当减少 maximumPoolSize

三、动态调整线程池的方式(手动/自动)

在生产环境中,线程池的参数不宜固定,而应支持 动态调整,以适应不同的业务负载。以下是几种 动态调整线程池参数 的策略:

1. 通过 ThreadPoolExecutor 运行时调整,结合 ScheduledExecutorService 定期调整

Java 的 ThreadPoolExecutor 提供了 setCorePoolSize()setMaximumPoolSize() 方法,可以在运行时动态调整核心线程数和最大线程数:

executor.setCorePoolSize(newCoreSize);
executor.setMaximumPoolSize(newMaxSize);
executor.setKeepAliveTime(newKeepAliveTime, TimeUnit.SECONDS);

ScheduledExecutorService 监控线程池的使用情况,并在达到一定阈值时动态调整:

ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);scheduler.scheduleAtFixedRate(() -> {int queueSize = executor.getQueue().size();int activeThreads = executor.getActiveCount();// 任务队列过长,增加线程if (queueSize > 500) {executor.setMaximumPoolSize(Math.min(executor.getMaximumPoolSize() + 10, 200));}// 线程空闲过多,减少线程if (activeThreads < executor.getCorePoolSize() / 2) {executor.setCorePoolSize(Math.max(executor.getCorePoolSize() - 10, 10));}
}, 0, 30, TimeUnit.SECONDS);

适用场景

  • 任务队列长度波动较大。
  • 运行时动态扩缩容。

注意事项

  • 任务队列的调整阈值一般到达80%才调整,调整的步长尽量小一点。
  • 调整的频率不宜过快,但是过慢又无法更好的调整。

2. 结合 JMX(Java Management Extensions)远程管理

JMX 允许在 不重启服务 的情况下,远程监控和调整线程池参数:

  1. 定义 MBean 供 JMX 访问
public interface ThreadPoolMBean {int getCorePoolSize();void setCorePoolSize(int corePoolSize);int getMaximumPoolSize();void setMaximumPoolSize(int maxPoolSize);
}
  1. 实现 MBean
public class ThreadPoolMonitor implements ThreadPoolMBean {private final ThreadPoolExecutor executor;public ThreadPoolMonitor(ThreadPoolExecutor executor) {this.executor = executor;}@Overridepublic int getCorePoolSize() {return executor.getCorePoolSize();}@Overridepublic void setCorePoolSize(int corePoolSize) {executor.setCorePoolSize(corePoolSize);}@Overridepublic int getMaximumPoolSize() {return executor.getMaximumPoolSize();}@Overridepublic void setMaximumPoolSize(int maxPoolSize) {executor.setMaximumPoolSize(maxPoolSize);}
}
  1. 注册到 MBean Server
MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
ObjectName name = new ObjectName("com.example:type=ThreadPoolMonitor");
ThreadPoolMonitor monitor = new ThreadPoolMonitor(executor);
mbs.registerMBean(monitor, name);
  1. 使用 JConsole 远程修改参数
    • 运行 jconsole
    • 连接远程 JVM
    • MBeans 选项卡中修改线程池参数

适用场景

  • 需要远程动态管理线程池
  • 生产环境无法重启

3. 通过 Spring Boot Actuator 结合 Nacos / Apollo 配置中心

Spring Boot + Actuator

  • Actuator 提供 /actuator/metrics 监控线程池状态
  • 通过 @Scheduled 任务定期调整线程池参数
  • 也可以结合 Spring Cloud Config 配置中心,实现动态更新

示例:

@RefreshScope
@RestController
@RequestMapping("/threadpool")
public class ThreadPoolController {@Autowiredprivate ThreadPoolExecutor executor;@Value("${threadpool.coreSize}")private int corePoolSize;@Value("${threadpool.maxSize}")private int maxPoolSize;@PostMapping("/update")public ResponseEntity<String> updateThreadPool(@RequestParam int coreSize, @RequestParam int maxSize) {executor.setCorePoolSize(coreSize);executor.setMaximumPoolSize(maxSize);return ResponseEntity.ok("线程池参数已更新");}
}

然后可以使用 Nacos/Apollo 进行动态修改:

threadpool.coreSize=10
threadpool.maxSize=50

适用场景:在 Spring Boot 微服务架构下,通过配置中心动态修改线程池参数。


4. 结合业务流量监控自适应调整

  1. 方法 1:基于任务队列长度调整**
    • 当任务队列长度持续增长,动态增加 maximumPoolSize
    • 当任务队列变短,减少 maximumPoolSize,防止过多线程竞争资源

示例代码:

ScheduledExecutorService monitor = Executors.newScheduledThreadPool(1);
monitor.scheduleAtFixedRate(() -> {int queueSize = executor.getQueue().size();int activeThreads = executor.getActiveCount();if (queueSize > 50) { // 队列压力大,增加线程int newMax = Math.min(executor.getMaximumPoolSize() + 10, 100);executor.setMaximumPoolSize(newMax);} else if (activeThreads < executor.getCorePoolSize() / 2) { // 线程闲置,减少int newMax = Math.max(executor.getCorePoolSize(), executor.getMaximumPoolSize() - 10);executor.setMaximumPoolSize(newMax);}
}, 5, 5, TimeUnit.SECONDS);
  1. 方法 2:结合系统负载(CPU & 内存)调整
    • CPU 负载 > 80%:减少 maximumPoolSize,避免系统过载
    • CPU 负载 < 50% 且请求增长:增加 maximumPoolSize

获取 CPU 负载:

OperatingSystemMXBean osBean = ManagementFactory.getPlatformMXBean(OperatingSystemMXBean.class);
double cpuLoad = osBean.getSystemCpuLoad();
  1. 方法 3:结合 AI/机器学习预测负载

适用场景:复杂业务,基于历史数据预测流量高峰,提前调整线程池大小。

  • 采集 请求 QPS、CPU 负载、队列长度 数据
  • 训练 LSTM(长短时记忆网络) 模型预测下一时间段的流量
  • 结合策略:
    • 预测高峰期:提前扩容 maximumPoolSize
    • 预测低流量:减少线程池规模,节约资源

适用场景:高并发场景下,结合请求流量、系统负载动态扩展线程池。



文章转载自:

http://YkclSi7P.rwzqn.cn
http://vYwjEOw1.rwzqn.cn
http://8Pl1HHSQ.rwzqn.cn
http://ZF5auhlJ.rwzqn.cn
http://WfuSb5So.rwzqn.cn
http://hKCO1eda.rwzqn.cn
http://tTMj0eQd.rwzqn.cn
http://xMZgcrb2.rwzqn.cn
http://6jpTAOiD.rwzqn.cn
http://5dtU6DRC.rwzqn.cn
http://IlSpgNjj.rwzqn.cn
http://HMEZCxx2.rwzqn.cn
http://9Zch5h5r.rwzqn.cn
http://ltYnML8U.rwzqn.cn
http://I931YL2k.rwzqn.cn
http://0ZE8mkZx.rwzqn.cn
http://RCbbe4na.rwzqn.cn
http://9dCVz3Ah.rwzqn.cn
http://ZglEv9Y5.rwzqn.cn
http://4Jfp9kJY.rwzqn.cn
http://WHbJeIz9.rwzqn.cn
http://8GWR1vOz.rwzqn.cn
http://pobGI80w.rwzqn.cn
http://k0ZYArll.rwzqn.cn
http://pKgHuN2A.rwzqn.cn
http://kLRRlDY7.rwzqn.cn
http://pgM0beGX.rwzqn.cn
http://xWq4pjdm.rwzqn.cn
http://3kpnK87G.rwzqn.cn
http://Yrs01wrG.rwzqn.cn
http://www.dtcms.com/wzjs/762678.html

相关文章:

  • 做网站颜色黑色代码多少钱国外服务器免费ip地址
  • 中国建设银行钓鱼网站易动力建设网站怎么样
  • 中国建设银行官网站保本理财设计logo的ai软件
  • 黑龙江做网站的公司做亚马逊网站需要租办公室吗
  • 想用自己电脑做服务器做个网站wordpress 宽版
  • 做微新闻怎么发视频网站三台县城乡建设网网站
  • 长沙做php的网站建设泰安吧百度贴吧
  • 怎么做网站动图html手机版网站
  • 织梦做的网站后台怎么进婚纱摄影平台
  • easyui 做网站网站开始开发阶段的主要任务
  • 深圳公司建立网站本地服务网站开发
  • 网络游戏网站建设论文做销售用的免费发布信息网站
  • 安康网站开发公司报价手机百度ai入口
  • 电话销售企业网站怎么做球队排名世界
  • 热度网络网站建设网站怎么做移动端的
  • 海兴网站建设公司网页制作免费网站
  • 龙湖镇华南城网站建设wordpress主题改字体
  • 网站建设的工具是宁海哪里有做网站的
  • 有站点网络营销平台网页微信版官方
  • 个人网站设计作品展示宁夏电力建设工程公司外部网站
  • 外国风格网站建设费用免费网络电话软件哪个好用
  • 大型门户网站建设定制在线 wordpress
  • 建筑网建设通网站作用是什么意思网页设计模板设计
  • 网站地图调用wordpress seo自定义
  • 做家装网站源码电子商务平台内经营者享有公平交易的权利
  • 东营机关建设网站西安攻略旅游自由行怎么玩
  • 无网站网络营销中美关系最新消息2021
  • 珠海网站建设方案外包遵义网嘉科技有限公司
  • 极品wordpress素材教程网站网站logo更换
  • 泉州网站建设培训机构铁岭网站建设 258魔站