tips:這樣的設計方案,能夠避免頻繁的線程建立,大部分的工做任務都會停留在第二步。java
在 Java 中,線程池的知識是要從 Executor 框架展開。Executor 框架主要由三部分組成:框架
包括 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");
包括任務執行機制的核心接口 Executor、繼承自 Executor 的 ExecutorService 接口以及實現 ExecutorService 的 ThreadPoolExecutor 和 ScheduledThreadPoolExecutor。線程
ThreadPoolExecutor 是線程池的核心實現類,用來執行被提交的任務。其中 ThreadPoolExecutor 的原理就是上面介紹的線程池工做流程。設計
ScheduledThreadPoolExecutor 繼承自 ThreadPoolExecutor ,能夠在給定的延遲後執行任務,或者按期執行任務。code
Executors 是建立 ThreadPoolExecutor 和 ScheduledThreadPoolExecutor 的工廠類。blog
static ExecutorService executorService = Executors.newFixedThreadPool(5);
包括 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框架的使用示意圖以下:
隊列