Java多线程之线程池调优
默认配置
- corePoolSize=1
- queueCapacity=Integer.MAX_VALUE
- maxPoolSize=Integer.MAX_VALUE
- keepAliveTime=60s
- allowCoreThreadTimeout=false
- rejectedExecutionHandler=AbortPolicy()
缺点
- corePoolSize核心线程初始值为1太少了
- queueCapacity和maxPoolSize设置这么大,怕线程太多,系统受不了
- rejectedExecutionHandler这个可以改一下
如何优化
需要根据几个值来决定
- tasks :每秒的任务数,假设为500~1000
- taskcost:每个任务花费时间,假设为0.1s
- responsetime:系统允许容忍的最大响应时间,假设为1s
做几个计算
corePoolSize = 每秒需要多少个线程处理?
- threadcount = tasks/(1/taskcost) =tasks*taskcout = (500~1000)*0.1 = 50~100 个线程。corePoolSize设置应该大于50
- 根据8020原则,如果80%的每秒任务数小于800,那么corePoolSize设置为80即可
queueCapacity = (coreSizePool/taskcost)*responsetime
- 计算可得 queueCapacity = 80/0.1*1 = 80。意思是队列里的线程可以等待1s,超过了的需要新开线程来执行
- 切记不能设置为Integer.MAX_VALUE,这样队列会很大,线程数只会保持在corePoolSize大小,当任务陡增时,不能新开线程来执行,响应时间会随之陡增。
maxPoolSize = (max(tasks)- queueCapacity)/(1/taskcost)
- 计算可得 maxPoolSize = (1000-80)/10 = 92
- (最大任务数-队列容量)/每个线程每秒处理能力 = 最大线程数
rejectedExecutionHandler:根据具体情况来决定,任务不重要可丢弃,任务重要则要利用一些缓冲机制来处理。
keepAliveTime和allowCoreThreadTimeout采用默认通常能满足
以上都是理想值,实际情况下要根据机器性能来决定。如果在未达到最大线程数的情况机器cpu load已经满了,则需要通过升级硬件(呵呵)和优化代码,降低taskcost来处理。
一些经验
dev配置
- corePoolSize=20
- queueCapacity=100
- maxPoolSize=150
- keepAliveTime=300s
- waitForTasksToCompleteOnShutdown=true,先做完任务再shutdown
- rejectedExecutionHandler=CallerRunsPolicy(),让调用的线程继续完成任务
prod配置
- corePoolSize=20
- queueCapacity=200
- maxPoolSize=500
- keepAliveTime=300s
- waitForTasksToCompleteOnShutdown=true,先做完任务再shutdown
- rejectedExecutionHandler=CallerRunsPolicy(),让调用的线程继续完成任务
建议
实际情况,还是建议先做压测,测试时尽量用理想的线程数,看看线程上限,再逐步调优线程池。
相关推荐
Java多线程是Java编程中的重要概念,它允许程序同时执行多个任务,提高了程序的效率和响应速度。在Java中,我们可以通过实现Runnable接口或继承Thread类来创建线程。然而,直接使用线程可能存在一些问题,如资源管理...
综上所述,"java多线程查询数据库"是一个涉及多线程技术、线程池管理、并发控制、分页查询等多个方面的复杂问题。通过理解和掌握这些知识点,我们可以有效地提高数据库操作的效率和系统的响应速度。
在这个“java+socket 及多线程线程池应用”的教程中,我们可以期待学习到以下核心知识点: 1. **Socket基础**:首先会讲解Socket的基本概念,包括服务器端Socket和客户端Socket的工作原理,以及TCP/IP协议在Socket...
《Java多线程编程实战指南》这本书深入浅出地讲解了Java多线程的核心概念和实战技巧,分为核心篇和设计模式篇,旨在帮助开发者掌握并应用多线程技术。 1. **线程基础** - **线程的创建**:Java提供了两种创建线程...
本文介绍了在Java多线程环境下减少内存占用量的一些关键策略,包括线程生命周期管理、对象生命周期设计、同步机制选择、线程池的使用和线程数量控制。同时,代码的异常处理和JVM参数调优也是提升多线程应用性能的...
Java中的线程池是并发编程中的重要概念,它在多线程环境中扮演着资源管理和优化的角色。线程池通过预创建一定数量的线程来管理线程生命周期,从而避免频繁地创建和销毁线程带来的开销。理解并熟练运用线程池能够显著...
《深入学习:Java多线程编程》是一本专注于Java并发技术的专业书籍,旨在帮助开发者深入理解和熟练运用Java中的多线程编程。Java多线程是Java编程中的核心部分,尤其在现代高性能应用和分布式系统中不可或缺。理解并...
由于提供的文件内容大部分与Java多线程编程核心技术并无直接关联,而是关于电子书资源的联系方式和说明,因此不能直接从这部分内容中生成关于Java多线程的知识点。但考虑到描述中提到了电子书的标题以及它涉及的主题...
7. **性能监控和调优**:在实际应用中,需要对多线程遍历的性能进行监控,包括CPU使用率、内存占用、磁盘I/O等指标。通过这些数据,我们可以调整线程池的大小、工作区域的划分策略,以达到最佳性能。 最后,提到的...
Java线程池是一种高效管理线程的技术,它允许开发者预定义一组线程,根据任务的需要灵活调度,而不是每次需要执行任务时都创建新的线程。这种设计模式大大提高了系统的性能,减少了系统资源的消耗,特别是在高并发...
Java多线程是Java编程中的核心概念,尤其在开发高并发、高性能的应用程序时不可或缺。本书籍《JAVA多线程教材》显然会深入探讨这一主题,帮助开发者掌握如何有效地利用多核处理器,提高程序的执行效率。PDF格式的...
在Java编程语言中,实现多线程文件传输是一种优化程序性能、提高系统资源...在提供的`java多线程文件传输`压缩包中,可能包含了实现这些概念的示例代码,通过分析和学习,可以更好地理解多线程文件传输的原理和实践。
在IT领域,多线程和高并发是两个关键概念,特别是在Java编程中,它们对于构建高效、可扩展的系统至关重要。下面将详细解释这两个概念及其在Java中的实现和应用。 多线程是指在一个应用程序中同时运行多个独立的执行...
本篇将深入探讨如何利用Java多线程技术来优化这种高负载场景。 首先,理解Java多线程的基础至关重要。在Java中,线程是程序执行的最小单元,可以通过实现`Runnable`接口或继承`Thread`类来创建线程。创建多线程的...
JAVA-WEB应用服务器调优需要从操作系统、JVM参数、TOMCAT服务器和NGINX反向代理等多方面入手,选择合适的操作系统,调整JVM参数,优化TOMCAT服务器和NGINX反向代理,提高服务器的性能和稳定性。
Java多线程设计模式是Java编程中至关重要的一个领域,它允许程序同时执行多个任务,提升系统的并发性能和资源利用率。在Java中,多线程主要用于处理I/O密集型任务和计算密集型任务,实现高效的并行处理。本文将深入...
在Java编程中,多线程技术是提升程序执行效率的关键之一,特别是在进行文件读写操作时。本主题将深入探讨如何使用多线程来优化文件的读取和写入过程,以及需要注意的相关问题。 首先,我们需要理解单线程与多线程在...
Java多线程设计模式是Java并发编程中的重要组成部分,它涉及如何合理地设计和使用多线程来提高程序的执行效率和响应能力。在设计多线程程序时,需要考虑多线程环境下资源共享、线程同步、死锁避免、性能优化等诸多...
在Java编程中,多线程下载文件是一种优化大文件下载效率的技术。它通过将一个大文件分割成多个小部分,然后在不同的线程中并行下载这些部分,从而充分利用网络带宽,加快下载速度。本源码实现了这样一个功能,让下载...