十一、執行緒池
阿新 • • 發佈:2021-08-02
執行緒池
1. 背景
- 建立/銷燬執行緒需要消耗系統資源,執行緒池可以複用已建立的執行緒
- 控制併發的數量,併發數量過多可能會導致資源大量消耗而造成崩潰
- 可以對執行緒做統一管理
2. 思路
提前建立好多個執行緒並放入執行緒池中,使用時直接獲取,用完再放回池中。這樣可以避免頻繁的建立銷燬、實現重複利用。類似生活中的公交工具。
3. 好處
- 提高相應速度,減少了建立新執行緒的時間
- 降低資源消耗,重複利用執行緒池中執行緒,不需要每次都建立
- 便於執行緒管理
corePoolSize
:核心執行緒數最大值maximumPoolSize
:最大執行緒數keepAliveTime
:非核心執行緒沒有任務時最多保持多長時間unit
:keepAliveTime
的單位workQueue
:阻塞佇列,維護著等待執行的Runnable
物件
4. 使用
- JDK5 後提供了執行緒池相關 API:
ExecutorService
和Executors
ExecutorService
:真正的執行緒池介面,常見子類為ThreadPoolExecutor
void execute(Runnable command)
:執行任務,沒有返回值,一般用來執行Runnable
<T> Future<T> submit(Callable<T> task)
:執行任務,有返回值,一般用來執行Callable
void shutdown()
:關閉連線池
Executors
:工具類、執行緒池的工廠類,用於建立並返回不同型別的執行緒池
例: public class TestPool { public static void main(String[] args) { // 1. 建立服務,建立執行緒池 // newFixedThreadPool 引數為執行緒池大小 ExecutorService service = Executors.newFixedThreadPool(10); // 執行 service.execute(new MyThread()); service.execute(new MyThread()); service.execute(new MyThread()); service.execute(new MyThread()); // 2. 關閉連線 service.shutdown(); } } class MyThread implements Runnable { @Override public void run() { System.out.println(Thread.currentThread().getName()); } }