数据库连接池和线程池

一、数据库连接池

1、数据库连接池

数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能。

 2、好处

1)资源重用 2)快速响应 3)新的资源分配手段  4) 统一的连接管理,避免数据库连接泄漏

3、数据库连接池的实现

使用动态代理实现Proxy.newProxyInstance(JdbcPool.class.getClassLoader(), conn.getClass().getInterfaces(), new InvocationHandler())实现连接池。

二、线程池

一个线程池的组成:

1. 线程池管理器(ThreadPoolManager):用于创建并管理线程池

2. 工作线程(WorkThread): 线程池中线程

3. 任务接口(Task):每个任务必须实现的接口,以供工作线程调度任务的执行。

4. 任务队列:用于存放没有处理的任务。提供一种缓冲机制。

 线程池的核心参数:

corePoolSize    线程池维护线程的最少数量;核心池的大小,这个参数跟后面讲述的线程池的实现原理有非常大的关系。在创建了线程池后,默认情况下,线程池中并没有任何线程,而是等待有任务到来才创建线程去执行任务,除非调用了prestartAllCoreThreads()或者prestartCoreThread()方法,从这2个方法的名字就可以看出,是预创建线程的意思,即在没有任务到来之前就创建corePoolSize个线程或者一个线程。默认情况下,在创建了线程池后,线程池中的线程数为0,当有任务来之后,就会创建一个线程去执行任务,当线程池中的线程数目达到corePoolSize后,就会把到达的任务放到缓存队列当中;

最佳线程数:最佳线程数目 = (线程等待时间与线程CPU时间之比 + 1)* CPU数目

maximumPoolSize  线程池维护线程的最大数量 

keepAliveTime   线程空闲时间 ,所以如果任务很多,并且每个任务执行的时间比较短,可以适当调大这个参数来提高线程的利用率。表示线程没有任务执行时最多保持多久时间会终止。

workQueue    任务队列,用来存放我们所定义的任务处理线程,

keepAliveTime 参数的单位,可选的单位:天(DAYS),小时(HOURS),分钟(MINUTES),毫秒(MILLISECONDS),微秒(MICROSECONDS)和纳秒(NANOSECONDS)

 

在ThreadPoolExecutor类中提供了四个构造方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class ThreadPoolExecutor extends AbstractExecutorService {
    .....
    public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,
            BlockingQueue<Runnable> workQueue);
 
    public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,
            BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory);
 
    public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,
            BlockingQueue<Runnable> workQueue,RejectedExecutionHandler handler);
 
    public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,
        BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler);
    ...
}
 
线程池的分类:
 

1、newCachedThreadPool

作用:创建一个可根据需要创建新线程的线程池,但是在以前构造的线程可用时将重用它们,并在需要时使用提供的 ThreadFactory 创建新线程。

特征: 
(1)线程池中数量没有固定,可达到最大值(Interger. MAX_VALUE) 
(2)线程池中的线程可进行缓存重复利用和回收(回收默认时间为1分钟) 
(3)当线程池中,没有可用线程,会重新创建一个线程

创建方式: Executors.newCachedThreadPool();

2、newFixedThreadPool

作用:创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程。在任意点,在大多数 nThreads 线程会处于处理任务的活动状态。如果在所有线程处于活动状态时提交附加任务,则在有可用线程之前,附加任务将在队列中等待。如果在关闭前的执行期间由于失败而导致任何线程终止,那么一个新线程将代替它执行后续的任务(如果需要)。在某个线程被显式地关闭之前,池中的线程将一直存在。

特征: 
(1)线程池中的线程处于一定的量,可以很好的控制线程的并发量 
(2)线程可以重复被使用,在显示关闭之前,都将一直存在 
(3)超出一定量的线程被提交时候需在队列中等待

创建方式: 
(1)Executors.newFixedThreadPool(int nThreads);//nThreads为线程的数量 
(2)Executors.newFixedThreadPool(int nThreads,ThreadFactory threadFactory);//nThreads为线程的数量,threadFactory创建线程的工厂方式

3、newSingleThreadExecutor

作用:创建一个使用单个 worker 线程的 Executor,以无界队列方式来运行该线程。(注意,如果因为在关闭前的执行期间出现失败而终止了此单个线程,那么如果需要,一个新线程将代替它执行后续的任务)。可保证顺序地执行各个任务,并且在任意给定的时间不会有多个线程是活动的。与其他等效的 newFixedThreadPool(1) 不同,可保证无需重新配置此方法所返回的执行程序即可使用其他的线程。

特征: 
(1)线程池中最多执行1个线程,之后提交的线程活动将会排在队列中以此执行

创建方式: 
(1)Executors.newSingleThreadExecutor() ; 
(2)Executors.newSingleThreadExecutor(ThreadFactory threadFactory);// threadFactory创建线程的工厂方式

4、newScheduleThreadPool

作用: 创建一个线程池,它可安排在给定延迟后运行命令或者定期地执行。

特征: 
(1)线程池中具有指定数量的线程,即便是空线程也将保留 
(2)可定时或者延迟执行线程活动

创建方式: 
(1)Executors.newScheduledThreadPool(int corePoolSize);// corePoolSize线程的个数 
(2)newScheduledThreadPool(int corePoolSize, ThreadFactory threadFactory);// corePoolSize线程的个数,threadFactory创建线程的工厂

5、newSingleThreadScheduledExecutor

作用: 创建一个单线程执行程序,它可安排在给定延迟后运行命令或者定期地执行。

特征: 
(1)线程池中最多执行1个线程,之后提交的线程活动将会排在队列中以此执行 
(2)可定时或者延迟执行线程活动

创建方式: 
(1)Executors.newSingleThreadScheduledExecutor() ; 
(2)Executors.newSingleThreadScheduledExecutor(ThreadFactory threadFactory) ;//threadFactory创建线程的工厂

 

 
 
posted @ 2019-01-09 19:30  Teenager  阅读(2849)  评论(0编辑  收藏  举报