标签:
java.util.concurrent.ThreadPoolExecutor类.
创建一个线程池有以下4个构造函数, 其中前3个都最终调用了最后一个.
CPU密集型任务, 尽可能少的线程. 如 Ncpu+1个线程.
IO密集型任务, 由于线程不是一直在执行任务, 可配置尽可能多的线程. 如 2*Ncpu
混合型任务,如果可以拆分为两个执行时间相差不太大的CPU密集型任务和IO密集型任务,分解后的吞吐率要高于串行的吞吐率。如果执行时间相差太大,就没必要分解。
PriorityBlockingQueue. 优先级高的任务先执行。 但如果一直有高优先级的任务加入,低优先级的任务可能永远无法执行。
执行时间不同的线程,可以交给不同规模的线程池,也可以使用优先队列,优先执行时间较短的线程。
依赖数据库连接的任务,因为线程提交SQL之后需要等待数据库返回结果,等待时间越长,CPU空闲时间越多。所以线程数应该设置大一些,才能更好地利用CPU。
建议使用有界队列。有界队列能增加系统的稳定性和预警能力。可以根据需要设置大一些,比如几千。
如果后台线程池里的线程全部要向数据库查询和插入数据,一旦数据库出了问题,导致SQL很慢,线程阻塞,就会大量积压。如果这时设置为无界队列,就有可能撑满内存,导致整个系统不可用。
通过扩展线程池进行监控。通过继承线程池并重写线程池的beforeExecute,afterExecute和terminated方法,我们可以在任务执行前,执行后和线程池关闭前干一些事情。如监控任务的平均执行时间,最大执行时间和最小执行时间等。这几个方法在线程池里是空方法。
参考资料
http://www.infoq.com/cn/articles/java-threadPool
http://blog.csdn.net/mazhimazh/article/details/19291965
标签:
原文地址:http://www.cnblogs.com/lddbupt/p/5758955.html