數據庫連接池和線程池


一、數據庫連接池

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創建線程的工廠

 

 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM