ThreadPoolExecutor线程池用法研究

1.ThreadPoolExecutor


参考:http://dlc.sun.com.edgesuite.net/jdk/jdk-api-localizations/jdk-api-zh-cn/publish/1.6.0/html/zh_CN/api/index.html?java/util/concurrent/ThreadPoolExecutor.html

2.ThreadPoolExecutor执行流程

1)首先线程池判断基本线程池是否已满?没满,创建一个工作线程来执行任务。满了,则进入下个流程。
2)线程池判断工作队列是否已满?没满,则将新提交的任务存储在工作队列里。满了,则进入下个流程。
3)最后线程池判断最大线程池是否已满?没满,则创建一个新的工作线程来执行任务,满了,则交给饱和策略来处理这个任务。

3. 定制线程池大小

线程池大小取决于被提交任务的类型和服务器的性能。
cpu ,内存
任务类型(计算密集型,io密集型)

int N = Runtime.availableProcessors();

计算密集型:N+1

IO密集型如(套接字等阻塞任务),由于线程并非一直运行,因此线程池规模应该更大。通过使用分析,可以估计某个典型请求的等待时间(WT)与实际占用CPU进行运算的时间(ST)之间的比例,这个估算不需要很精确。如果我们将这一比例称之为 WT/ST,那么对于一个具有 N 个处理器的系统,需要设置大约 N*(1+WT/ST) 个线程来保持处理器得到充分利用

幸运的是,设置线程池的大小并不困难,只需要避免过大或过小这两种极端情况。

如果线程过大,大量的线程将在相对很少的cpu和内存资源上竞争,这不仅导致更高内存使用,而且可能导致资源耗尽。

如果线程池过小,将导致许多空闲的处理器无法工作,cpu利用率低,从而降低吞吐率。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值