论坛首页 Java企业应用论坛

ThreadPoolExecutor几点使用建议

浏览 64352 次
该帖已经被评为良好帖
作者 正文
   发表时间:2011-12-07  
happysoul 写道
paulwong 写道
如果每天十万条线程这种级别的,是否建议使用ThreadExecutorPool?

能用10w个线程?你不会是用来群发垃圾邮件用的吧?
即使是10w个 你也应该分段执行
按照几百一个阶段循环调用,或者定时监控队列然后填充待运行的线程而不是一次全都扔进去
最主要的是 tcp/ip 带宽 是一个很大的问题,即使你扔进去了10w,后期等待的时间还是固定的,尽量不要大量占用内存空间
再就是 非要单机运行这么多线程,这么考虑问题本身就有问题,多线程的原理就是cpu随机去执行多个任务,中途会多次挂起单个线程去运行其他线程。
每天都这么多 就应该考虑 远程调用分配执行任务的方式搭建你的服务了,一台任务分发服务器+多台供远程调用多线程的服务武器
分发端负责分配线程任务分配,然后将任务分发至多台执行并定时获取被调用端执行进度..................


有做分布式的,十万分到每个JVM也就是一万左右。将这一万往队列里面塞也是可以的,同时运行的线程数就设为10,队列数取自然数的最大值,基本够用。
0 请登录后投票
   发表时间:2011-12-08  
有点好奇,象EJB的SESSION BEAN处理高并发量的做法是不是也是这种机制。
0 请登录后投票
   发表时间:2011-12-08  
paulwong 写道
如果每天十万条线程这种级别的,是否建议使用ThreadExecutorPool?

好像应该用吧 ~~
0 请登录后投票
   发表时间:2011-12-09  
这是比较基础的知识,不懂的同学,请买本《java并发编程实践》好好看一下。
0 请登录后投票
   发表时间:2011-12-09  
jameswxx 写道
这是比较基础的知识,不懂的同学,请买本《java并发编程实践》好好看一下。

中文版据说很翻译的很烂
0 请登录后投票
   发表时间:2011-12-10  
我也用这个,不过还是建议得根据实际的情况进行设置。

核心线程数和最大线程数要根据实际调优得出来。

另外我一个体会是使用无界的LinkedBlockingQueue一定要小心,弄不好你的任务里面一旦由于某种原因导致处理速度慢的话,OOM就来了啊。


0 请登录后投票
   发表时间:2011-12-12  
daly1987 写道
我也用这个,不过还是建议得根据实际的情况进行设置。

核心线程数和最大线程数要根据实际调优得出来。

另外我一个体会是使用无界的LinkedBlockingQueue一定要小心,弄不好你的任务里面一旦由于某种原因导致处理速度慢的话,OOM就来了啊。



如果是在SERVLET中启用线程,是取不了上下文。
0 请登录后投票
   发表时间:2012-08-08  
所以建议:  maximumPoolSize >= corePoolSize =期望的最大线程数。 (我曾经配置了corePoolSize=1, maximumPoolSize=20, blockqueue为无界队列,最后就成了单线程工作的pool。典型的配置错误)


关于这个我不是太理解,去翻了翻官方分API

 

官方给出的解释是

corePoolSize - the number of threads to keep in the pool, even if they are idle.
maximumPoolSize - the maximum number of threads to allow in the pool.

大致上还是说是线程池呀? 这里不是很明白.请楼主给解惑.

 

0 请登录后投票
   发表时间:2012-11-05   最后修改:2012-11-05
因为项目需要花了点时间做了个带缓存的有界队列实现,能很好的解决使用ThreadPoolExecutor的常见问题。目前该组件已经开源,地址https://github.com/netcomm/sponge。代码实现非常简单,类也很少。有任何问题都可以在github上提出或联系我。
sponge介绍
#使用方式跟普通的ThreadPoolExecutor没有任何差别,开发人员没有任何感觉。

#在突发情况极大并发请求下,保证系统的稳定性为第一目标。

#能自动缓冲超过某个阀值的任务请求。

#缓冲持久化的方式灵活,可根据使用场景进行选择,如基于文件(系统吞吐量巨大)、数据库(系统吞吐量大)、redis(系统吞吐量巨大)、…。

#任务的请求处理顺序默认先进先出模式。

#实现原理简单、代码精简。

#默认实现基于文件的缓冲持久化模式。

#关键参数可调整。
0 请登录后投票
   发表时间:2012-11-06  
1.  pool threads启动后,以后的任务获取都会通过block queue中,获取堆积的runnable task.

所以建议: block size >= corePoolSize ,不然线程池就没任何意义

这个不懂?不是说当提交的任务数超过了corePoolSize,才会将当前的runable提交到一个block queue中吗?
为什么pool threads启动后,以后的任务获取都会通过block queue中了?
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics