1. 程式人生 > 其它 >十一、執行緒池

十一、執行緒池

執行緒池

1. 背景

  • 建立/銷燬執行緒需要消耗系統資源,執行緒池可以複用已建立的執行緒
  • 控制併發的數量,併發數量過多可能會導致資源大量消耗而造成崩潰
  • 可以對執行緒做統一管理

2. 思路

​ 提前建立好多個執行緒並放入執行緒池中,使用時直接獲取,用完再放回池中。這樣可以避免頻繁的建立銷燬、實現重複利用。類似生活中的公交工具。

3. 好處

  • 提高相應速度,減少了建立新執行緒的時間
  • 降低資源消耗,重複利用執行緒池中執行緒,不需要每次都建立
  • 便於執行緒管理
    • corePoolSize:核心執行緒數最大值
    • maximumPoolSize:最大執行緒數
    • keepAliveTime:非核心執行緒沒有任務時最多保持多長時間
    • unitkeepAliveTime的單位
    • workQueue:阻塞佇列,維護著等待執行的Runnable物件

4. 使用

  • JDK5 後提供了執行緒池相關 API:ExecutorServiceExecutors
  • 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());
    }
}