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框架的使用示意图以下:
队列