1. 程式人生 > >【Java並發核心四】Executor 與 ThreadPoolExecutor

【Java並發核心四】Executor 與 ThreadPoolExecutor

rup format int try 實現 stack ide 抽象 public

Executor ThreadPoolExecutor 實現的是線程池,主要作用是支持高並發的訪問處理。

Executor 是一個接口,與線程池有關的大部分類都實現了此接口。

ExecutorService 是 Executor 的子接口;AbstractExecutorService 是 ExecutorService 的實現類,但是是抽象類。

ThreadPoolExecutor 是 AbstractExecutorService 的子類,可實例化。

Executors 是一個工廠類,用於創建線程池。

1、Executors 的 使用:

  (1) newCachedThreadPool

() 返回 ExecutorService 實例,創建無界限線程池,理論上線程最大個數是 Integer.MAX_VALUE,使用舉例:

     final SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
        ExecutorService executorService = Executors.newCachedThreadPool();
        // 此線程池運行5個線程
        for (int i = 0; i < 5; i++) {
            
final int index = i; executorService.execute(new Runnable() { @Override public void run() { System.out.println("Thread-" + index + "-begin-" + sf.format(new Date())); try { Thread.sleep(1000); }
catch (InterruptedException e) { e.printStackTrace(); } System.out.println("Thread-" + index + "-end-" + sf.format(new Date())); } }); }

  運行結果:

  技術分享圖片

  從上圖可以看出,線程在execute 加載後,基本是並發執行的,並非順序執行。

  (2) newFixedThreadPool(int) 返回 ExecutorService 實例,創建的是有界線線程池,即線程個數可以指定最大數量,如果超過最大數量,則後加入的線程需要等待。

    還有api:newFixedThreadPool(int , ThreadFactory),newCachedThreadPool( ThreadFactory ) 方法同理。

  (3) newSingleThreadExecutor() 創建單一線程池,實現以隊列的方式來執行任務。

2、ThreadPoolExecutor 的使用:

  Executors 工廠類中,很多地方是調用的 ThreadPoolExecutor 來實現的,單獨調用 ThreadPoolExecutor 要考慮的相對要多一些但也更靈活。

【Java並發核心四】Executor 與 ThreadPoolExecutor