ThreadPoolExecutor带来的性能问题
使用线程池,一般情况下会带来性能提升,并且使用线程池管理线程,减少了每个任务调用的开销,通常可以在执行大量异步任务时提供增强的性能。
但是在高并发的情况下,会因为使用不当导致性能下降,并且下降得比较严重,下面来讲解一下原因。
ThreadPoolExecutor是jdk1.5版本增加的,在java.util.concurrent包中。
构造方法摘要
ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue workQueue)
各个参数说明:
corePoolSize - 池中所保存的线程数,包括空闲线程。
maximumPoolSize - 池中允许的最大线程数。
keepAliveTime - 当线程数大于核心时,此为终止前多余的空闲线程等待新任务的最长时间。
unit - keepAliveTime 参数的时间单位。
workQueue - 执行前用于保持任务的队列。
在系统设计时,采用了ArrayBlockingQueue,防止资源耗尽带来的系统问题,但是这个队列在高并发的情况下,会因为线程的上下文切换开销,导致队列排队,任务频繁阻塞,从而导致系统出现严重的性能问题。