多線程編程學習十(線程池原理).

1、線程池工做流程

  1. 線程池判斷核心線程池裏的線程是否都在執行任務。若是不是,則建立一個新的工做線程來執行任務(須要得到全局鎖)。若是核心線程池裏的線程都在執行任務,則進入下個流程。
  2. 線程池判斷工做隊列是否已滿。若是工做隊列沒有滿,則將新提交的任務存儲在這個工做隊列裏。若是工做隊列滿了,則進入下個流程。
  3. 線程池判斷線程池的線程是否都處於工做狀態。若是沒有,則建立一個新的工做線程來執行任務(須要得到全局鎖)。若是已經滿了,則交給飽和策略(例如拋出異常)來處理這個任務。

tips:這樣的設計方案,能夠避免頻繁的線程建立,大部分的工做任務都會停留在第二步。java

2、Executor 框架

在 Java 中,線程池的知識是要從 Executor 框架展開。Executor 框架主要由三部分組成:框架

1. 任務

包括 Runnable 接口或 Callable 接口。Runnable 接口無返回值,Callable 有返回值。異步

// Runnable 和 Callable 均可以直接被 ThreadPoolExecutor 和 ScheduledThreadPoolExecutor 執行
Runnable runnable = () -> System.out.println(123);
// Executors 能夠將 Runnable 轉化成 Callable
Callable<Object> callable = Executors.callable(runnable);
Callable<String> success = Executors.callable(runnable, "success");

2. 任務的執行

包括任務執行機制的核心接口 Executor、繼承自 Executor 的 ExecutorService 接口以及實現 ExecutorService 的 ThreadPoolExecutor 和 ScheduledThreadPoolExecutor。線程

ThreadPoolExecutor 是線程池的核心實現類,用來執行被提交的任務。其中 ThreadPoolExecutor 的原理就是上面介紹的線程池工做流程。設計

ScheduledThreadPoolExecutor 繼承自 ThreadPoolExecutor ,能夠在給定的延遲後執行任務,或者按期執行任務。code

Executors 是建立 ThreadPoolExecutor 和 ScheduledThreadPoolExecutor 的工廠類。blog

static ExecutorService executorService = Executors.newFixedThreadPool(5);

3. 異步計算的結果

包括 Future 接口以及實現 Future 的 FutureTask 類。繼承

// 執行 Runnable
executorService.execute(runnable);
// 執行 Callable
Future<Object> submit = executorService.submit(callable);
// Future 的 get 方法會阻塞線程直到完成
System.out.println(submit.get());
Future<String> future = executorService.submit(success);
System.out.println(future.get());


Executor 線程池的使用大抵以下,首先,咱們須要建立 Runnable 或者 Callable 任務。而後經過 ThreadPoolExecutor.execute() 或者 ThreadPoolExecutor.submit() 把任務交給 ThreadPoolExecutor 容器執行。由 submit 提交的任務會返回 Future,表示線程執行的結果,其中 Future 的 get 方法會阻塞線程直到完成。接口

Executor框架的使用示意圖以下:
隊列

相關文章
相關標籤/搜索