本文将讨论下java线程池、数据库线程池和tomcat线程池,还包括redis线程池等,其原理基本相同,主要会设计各个池不同的地方。
1.java线程池
ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)上面的代码是新建一个线程池对象,其中有7个参数,一般threadFactory和RejectedExecutionHandler使用的默认的。
corePoolSize:核心线程数;maximumPoolSize:最大线程数;keepAliveTime:线程数大于corePoolSize时空闲线程存活时间;unit:时间单位;workQueue:待执行线程队列,当线程数=corePoolSize时放入此队列。
当线程数>maximumPoolSize时执行RejectedExecutionHandler策略;
当队列已满且线程数<=maximumPoolSize直接新建线程。主要有
LinkedBlockingQueue、ArrayBlockingQueue和SynchronousQueue,最好用有界的。threadFactory:线程创建工厂
RejectedExecutionHandler:拒绝策略,直接拒绝等等。线程数通过原子类计数。
java实践线程池的类主要有:
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads, 0L,
TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>());}public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>());}public static ExecutorService newSingleThreadExecutor() {
return new FinalizableDelegatedExecutorService(new ThreadPoolExecutor(1, 1,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>()));}2.数据库连接池
主要控制核心连接数最大连接数,超过最大连接数拒绝或者等待直到超时。使用开源的c3p0、druid和dbcp等
可以运用java连接池处理。
3.tomcat连接池
tomcat连接池设置参数有accept-count连接数、max-connetions最大连接数、max-threads最大工作线程数和min-spare-threads最小工作线程数,超过accept-count连接数后新建连接,直到达到最大连接数。 连接数超过max-connetions决绝连接,线程数(或请求数)超过accept-count+max-threads拒绝连接。
通过Jemter等压测工具测试性能后设置线程数。