线程池总结

277 阅读2分钟

本文将讨论下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等压测工具测试性能后设置线程数。