项目体验:高并发httpclient和线程池的正确使用

这段时间以来都在同事在研发一个公司的新项目,其中使用到了一个技术,由于不熟悉而导致了一些性能上的问题。现简略作一下总结。

1、ExecutorService

用这个java提供的线程池机制还是很方便的,比自己写的池好得多。一般都会使用 ExecutorService normalExService = Executors.newFixedThreadPool(30) 来指定一个有30个固定大小线程的池。这只是新建了个池子,只有往里面放入thread类对象时才会运行。方法是调用

exService.execute(msgThread)

execute()相当于把一个继承了Thread或实现了Runnable接口的线程类当成一个任务加入到pool中。一个task一旦被加入到了pool,则由空闲的thread去竞争获取并执行。

如果execute了10次,怎么判断这10个task都完成了呢。

while (!exService.isTerminated()) {

  // 执行中

}

可以用一个while,用exService.isTerminated()来判断是否所有的task都完成。嗯。。这些都不是要说的问题。试想一下。如果一直不停地往pool中加入task,但是task的处理速度远跟不上加入的速度,但造成pool积压严重。其实如果只一个空的task,也不会有多大问题。用JProfiler看了一下JVM,发现40w个task,本身也只有10m左右。

但是,如果task中又包含了很多对象,如字符串,map,list等等,在生成task时也会把这些东西一起生成,即使加了pool中,又不会马上执行到,只能是空站着耗内存罢了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值