池與執行緒池 技術點 目錄 1. 執行緒池作用: 提升效能 1 2. 使用流程 1 3. 執行緒與執行緒池的監控 jvisual 1 4. 執行緒常用方法 2 5. 執行緒池相關概念 2 5.1. 佇列
池與執行緒池 技術點
目錄
Need rejenlei from myesi docx
類似 物件池,資料庫連線池
建立執行緒池。。
新增執行緒。。
join方法,等待執行緒t執行完畢
Wait sleep
生產者、消費者有很多的實現方法:
- 用wait() / notify()方法
- 用Lock的多Condition方法
- BlockingQueue阻塞佇列方法
通常會在電話面試中經常被問到的Java執行緒面試問題。
最大的不同是在等待時wait會釋放鎖,而sleep一直持有鎖。Wait通常被用於執行緒間互動,sleep通常被用於暫停執行
演算法類,一般是cpu核心數
Io類,一般提升一個數量級。。具體根據io繁忙程度調整
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler) {
corePoolSize:核心池的大小,這個引數跟後面講述的執行緒池的實現原理有非常大的關係。在建立了執行緒池後,預設情況下,執行緒池中並沒有任何執行緒,而是等待有任務到來才建立執行緒去執行任務,除非呼叫了prestartAllCoreThreads()或者prestartCoreThread()方法,從這2個方法的名字就可以看出,是預建立執行緒的意思,即在沒有任務到來之前就建立corePoolSize個執行緒或者一個執行緒。預設情況下,在建立了執行緒池後,執行緒池中的執行緒數為0,當有任務來之後,就會建立一個執行緒去執行任務,當執行緒池中的執行緒數目達到corePoolSize後,就會把到達的任務放到快取隊列當中;
maximumPoolSize:執行緒池最大執行緒數,這個引數也是一個非常重要的引數,它表示線上程池中最多能建立多少個執行緒;
keepAliveTime:表示執行緒沒有任務執行時最多保持多久時間會終止。預設情況下,只有當執行緒池中的執行緒數大於corePoolSize時,keepAliveTime才會起作用,直到執行緒池中的執行緒數不大於corePoolSize,即當執行緒池中的執行緒數大於corePoolSize時,如果一個執行緒空閒的時間達到keepAliveTime,則會終止,直到執行緒池中的執行緒數不超過corePoolSize。但是如果呼叫了allowCoreThreadTimeOut(boolean)方法,線上程池中的執行緒數不大於corePoolSize時,keepAliveTime引數也會起作用,直到執行緒池中的執行緒數為0;
unit:引數keepAliveTime的時間單位,有7種取值,在TimeUnit類中有7種靜態屬性:
TimeUnit.DAYS; //天
TimeUnit.HOURS; //小時
TimeUnit.MINUTES; //分鐘
TimeUnit.SECONDS; //秒
TimeUnit.MILLISECONDS; //毫秒
TimeUnit.MICROSECONDS; //微妙
TimeUnit.NANOSECONDS; //納秒
workQueue:一個阻塞佇列,用來儲存等待執行的任務,這個引數的選擇也很重要,會對執行緒池的執行過程產生重大影響,一般來說,這裡的阻塞佇列有以下幾種選擇:
ArrayBlockingQueue
LinkedBlockingQueue
SynchronousQueue
PriorityBlockingQueue
ArrayBlockingQueue和PriorityBlockingQueue使用較少,一般使用LinkedBlockingQueue和SynchronousQueue。執行緒池的排隊策略與BlockingQueue有關。
threadFactory:用於設定建立執行緒的工廠,可以通過執行緒工廠給每個創建出來的執行緒做些更有意義的事情,比如設定daemon和優先順序等等
handler:表示當拒絕處理任務時的策略,有以下四種取值:
1、AbortPolicy:直接丟擲異常。2、CallerRunsPolicy:只用呼叫者所線上程來執行任務。3、DiscardOldestPolicy:丟棄佇列裡最近的一個任務,並執行當前任務。4、DiscardPolicy:不處理,丟棄掉。5、也可以根據應用場景需要來實現RejectedExecutionHandler介面自定義策略。如記錄日誌或持久化不能處理的任務。
}
2. 執行緒池問題 4
2.1. 什麼是執行緒池: 4
2.2. 一個執行緒池包括以下四個基本組成部分:執行緒池管理器(ThreadPool)工作執行緒(PoolWorker)任務介面(Task)任務佇列(taskQueue): 5
2.3. 2.常見執行緒池newFixedThreadExecutor(n) ③newCacheThreadExecutor(推薦使用) 5
2.4. 二:執行緒池執行緒池的作用: 5
2.5. 為什麼要用執行緒池: 6
2.6. 排隊有三種通用策略:直接提交。無界佇列。有界佇列。 6
3. 執行緒池常見引數 6
3.1. 為什麼要使用執行緒池? 8
3.2. 執行緒池有什麼作用? 8
3.3. 說說幾種常見的執行緒池及使用場景 8
3.4. 執行緒池都有哪幾種工作佇列 8
3.5. 怎麼理解無界佇列和有界佇列 9