`
javamonkey
  • 浏览: 168372 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

线程池大小设定

阅读更多
    网上看到有人说线程池大小设定原则,其主要问题就是怕设置大了影响性能。我以前也是这么认为,因为首先书上这么写的,其次是像weblogic有自调优线程池.也间接论证了需要仔细设定线程池大小。
    不过有一次心血来潮,想写一个自调优线程池的时候,(使用HP小型机做的调试)发现实际情况不是这样。线程设置大一些,并不会对应用有多大的负面效果,充其量CPU消费可能比最佳线程数大小多一点点。相反,不可以找这个最佳值,设定一个较为大的值是有好处的。因为如果特定应用属于高IO,低计算的易用,如数据库存储,那么处理线程池当然是越大越好。对于以计算为主的,譬如大量的xml解析,及时设置过大的线程数,但因为操作系统内核线程数固定,虚拟机线程只能映射到固定的内核线程上,所以,设置多少都没有关系了。

   本来测试的有一组数据,就懒得公布了。结论就是线程池设置大一些,没有关系的 :)
分享到:
评论
8 楼 mvpwar 2011-02-16  
都是高手啊,学习学习
7 楼 javamonkey 2011-02-15  
频繁切换是因为业务逻辑的要求,譬如读一个文件,访问数据库等,线程频繁切换是要造成影响,可这跟设置线程池大小有什么关系?

6 楼 iaimstar 2011-02-15  
我好像写错了、、、、防止误导 删了
5 楼 aofeng 2011-02-14  
对于以计算为主的,譬如大量的xml解析,及时设置过大的线程数,但因为操作系统内核线程数固定,虚拟机线程只能映射到固定的内核线程上,所以,设置多少都没有关系了。

???

不能过大,过多的线程会给CPU造成负担,各线程之间的切换也会消耗资源。如果线程池是针对数据库和文件操作,就更加要适量。可以通过测试得出合理利用资源的数量。具体的环境要具体测试才能得出最佳数据。
4 楼 jellyfish 2011-02-14  
two other considerations when using threads are:
1. CPU has L1/2/3 level caches, cache miss has a high performance penality.
2. Thread context switching also has performance penalty.

So frequently switching of threads might not be a good idea.
3 楼 DAOException 2011-02-14  
javamonkey 写道
yangyi 写道
CPU敏感应用:N 或者 N+1,如存在阻塞I/O,则因非所有线程都占用CPU,需要更多线程,其数量一般为:N*(1+WT/ST),其中WT/ST是等待时间和服务时间比,N为CPU Core数。一般来说,可以用NIO来替换BIO这样就可以省去额外线程所需的资源,包括CPU,内存等。当线程池大到一定程度时,I/O,FD,数据库连接等都可能成为新的瓶颈。


看不懂,不过最后一句话结论是认同的,因为线程池设置过大,如果其他地方,譬如数据库连接实际上也要用到自己的线程池。会有显著的影响的



他的意思是合理利用CPU资源,不管在阻塞或者非阻塞的情况下,尽量不让CPU空闲下来
2 楼 javamonkey 2011-02-14  
yangyi 写道
CPU敏感应用:N 或者 N+1,如存在阻塞I/O,则因非所有线程都占用CPU,需要更多线程,其数量一般为:N*(1+WT/ST),其中WT/ST是等待时间和服务时间比,N为CPU Core数。一般来说,可以用NIO来替换BIO这样就可以省去额外线程所需的资源,包括CPU,内存等。当线程池大到一定程度时,I/O,FD,数据库连接等都可能成为新的瓶颈。


看不懂,不过最后一句话结论是认同的,因为线程池设置过大,如果其他地方,譬如数据库连接实际上也要用到自己的线程池。会有显著的影响的
1 楼 yangyi 2011-02-12  
CPU敏感应用:N 或者 N+1,如存在阻塞I/O,则因非所有线程都占用CPU,需要更多线程,其数量一般为:N*(1+WT/ST),其中WT/ST是等待时间和服务时间比,N为CPU Core数。一般来说,可以用NIO来替换BIO这样就可以省去额外线程所需的资源,包括CPU,内存等。当线程池大到一定程度时,I/O,FD,数据库连接等都可能成为新的瓶颈。

相关推荐

    简单线程池与线程池检查的实现

    3. 控制器:管理线程池大小,根据系统资源动态调整。 4. 守护线程:监控线程池状态,处理线程的创建与销毁。 线程池的实现通常包括以下步骤: 1. 创建线程池:根据需求设置线程池的参数,如最小线程数、最大线程数...

    基于分段的线程池尺寸自适应调整算法.pdf

    因此,提出了一种能够根据用户请求的变化自动调整线程池大小的算法。 #### 算法原理 本算法的核心思想是将用户请求量划分为三个阶段:上升段、平衡段和下降段,并根据当前用户请求的数量和现有线程的数量来动态...

    浅谈java常用的几种线程池比较

    2. **资源不足**:线程池大小设定不当可能导致资源过度消耗。线程本身需要内存和其他系统资源,过多的线程会导致资源浪费和性能下降。此外,线程执行的任务可能需要数据库连接等其他资源,过多并发请求可能导致这些...

    linux 实现一个简单的线程池及工作

    - **线程池初始化**:设置线程池大小,创建线程并保存在数据结构中。 - **任务队列**:存放待处理的任务,通常使用队列数据结构。 - **调度策略**:决定何时分配任务给线程,如轮询、优先级等。 - **线程同步**...

    实现线程池.rar

    初始化时,我们会根据需求设置线程池的大小,并创建相应数量的线程。 2. **工作队列**:工作队列是线程池的核心,用于存放待处理的任务。当有新的任务需要执行时,我们会将其放入队列。队列可以是先进先出(FIFO)...

    JAVA线程池原理以及几种线程池类型介绍

    1. **FixedThreadPool**:创建一个固定大小的线程池,线程数量由用户指定。当所有线程都在执行任务时,新提交的任务会被放入队列中等待执行。 2. **CachedThreadPool**:创建一个可根据需要创建新线程的线程池,但在...

    线程池之ThreadPoolExecutor.docx

    线程池的工作机制在于控制线程数量,它会将任务放入队列,然后根据线程池的设定创建并启动线程执行这些任务。如果线程数量超过最大限制,额外的任务会被排队等待,直到有线程完成任务释放资源。线程池的使用有三个...

    C++实现的线程池

    8. **性能优化**:线程池的大小需要根据系统资源和应用需求进行调整,过多的线程可能导致资源浪费,过少则可能限制并发能力。此外,线程池的实现还应考虑任务提交和分配的效率,避免过度调度。 在VC++ 2010环境下...

    线程池 threadpool

    因此,合理设定线程池大小是优化并发性能的关键。 5. **工作线程与IO完成端口(IOCP)**:在Windows下,结合IO完成端口可以进一步提高线程池的效率,特别是处理大量I/O操作时。IOCP允许一个线程处理多个已完成的I/O...

    关于线程池的代码demo

    6. **线程池维护**: 当线程池中的线程数量超过设定值,多余线程会被销毁。同时,线程池会根据运行状态和当前任务量动态调整线程数量。 在Java中,我们可以使用`Executors`工厂类创建线程池,如`newFixedThreadPool`...

    用线程池异步加载

    线程池允许我们设定核心线程数、最大线程数、线程存活时间以及任务队列等参数,以适应不同的应用需求。例如,我们可以设置一个固定大小的线程池,当任务数量增加时,新任务将被放入队列等待,而不是立即创建新的线程...

    Android线程池ExcutorService

    - `newFixedThreadPool(int nThreads)`: 创建一个固定大小的线程池,当线程池大小达到设定值后,新提交的任务会在队列中等待,直到有线程空闲出来。 - `newSingleThreadExecutor()`: 创建一个只有一个线程的线程池...

    springmvc+spring线程池处理http并发请求数据同步控制问题

    1. 适当的线程池大小:根据服务器硬件配置和业务特性,合理设定线程池的大小,避免过度消耗资源或处理请求不及时。 2. 请求队列设计:队列长度应足够大,以缓冲高峰期的请求,但也不能过大导致内存压力。 3. 异常...

    Java中的线程与线程池.pptx

    因此,推荐自定义配置线程池,如使用有界队列ArrayBlockingQueue,并合理设定核心线程数、最大线程数和拒绝策略,以确保线程池稳定且高效地运行。 总之,理解Java中的线程和线程池原理,以及如何正确使用它们,对于...

    android(java)四大线程池详解

    - 考虑线程池大小的设定,通常可以根据系统的处理器核心数(`Runtime.getRuntime().availableProcessors()`)来决定。 - 注意线程池的任务队列大小,过大会增加内存压力,过小可能导致任务堆积。 - 使用线程池时...

    java线程池使用说明[借鉴].pdf

    3. `newCachedThreadPool`:创建可缓存线程池,线程池大小无限制,空闲线程超过60秒未执行任务会被回收,当任务量增加时,线程池会自动扩大规模。 4. `newScheduledThreadPool(int corePoolSize)`:创建一个大小无限...

    socket 线程池实现

    线程池大小是指系统允许同时运行的最大线程数量,可以根据服务器硬件资源和应用需求来设定。工作队列用于存储待处理的任务,当所有工作线程都在忙碌时,新任务会被放入队列等待。线程工厂用于创建线程,可以自定义...

    Linux-thread-pool.rar_线程池

    - **线程回收**:当线程池大小超过设定阈值时,多余的线程会被销毁或暂停。 - **线程调整**:根据系统负载动态调整线程池大小。 3. **Linux线程池实现** 在Linux中,我们可以使用标准C库中的`pthread`接口来创建...

    socket 线程池实现(已经在项目中应用)

    1. 根据系统资源和预期的并发连接数合理设定线程池大小。 2. 设置适当的超时策略,防止客户端长时间无响应导致线程被阻塞。 3. 监控线程池状态,当线程池中的任务堆积过多时,可能需要调整服务或增加服务器资源。 4....

Global site tag (gtag.js) - Google Analytics