这段时间以来都在同事在研发一个公司的新项目,其中使用到了一个技术,由于不熟悉而导致了一些性能上的问题。现简略作一下总结。
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中,又不会马上执行到,只能是空站着耗内存罢了。
<