Java Thread 的一点总结3

Java Thread 的一点总结3

Java 多线程中的名称太多了,丈二和尚摸不着头脑,这里浅显的尝试整理下。

Runnable 和 Callable 表示要执行的异步任务(Task)

Runnable 没有返回结果,不会抛出异常

Callable 有返回结果,会抛出异常

Executor 和 ExecutorService 表示执行服务

执行服务封装了任务执行的细节,对于任务提交者而言,它可以关注于任务本身,如提交任务、获取结果、取消任务,而不需要关注任务执行的细节,如线程创建、任务调度、线程关闭等等。

Future 表示异步任务的结果

异步任务一般是没有返回值的,如果想要返回值就用 Future 来接收。

Future 是一个重要的概念,是实现“任务的提交”与”任务的执行“相分离的关键,是其中的”纽带“,任务提交者和任务执行服务通过它隔离各自的关注点,同时进行协作。

有了 Future 之后,你就可以在提交任务之后先执行别的,等到这边有结果了再取,这就是一种分离。

Executors 是一个工具类,类似于 Collections

Executors 提供工厂方法来创建不同类型的线程池,比如 FixedThreadPool 或 CachedThreadPool。


Executor vs ExecutorService vs Executors

这三者均是 Executor 框架中的一部分。Java 开发者很有必要学习和理解他们,以便更高效的使用 Java 提供的不同类型的线程池。这三者间的区别:

  • Executor 和 ExecutorService 这两个接口主要的区别是:ExecutorService 接口继承了 Executor 接口,是 Executor 的子接口
  • Executor 和 ExecutorService 第二个区别是:Executor 接口定义了 execute()方法用来接收一个Runnable接口的对象,而 ExecutorService 接口中的 submit()方法可以接受Runnable和Callable接口的对象
  • Executor 和 ExecutorService 接口第三个区别是 Executor 中的 execute() 方法不返回任何结果,而 ExecutorService 中的 submit()方法可以通过一个 Future 对象返回运算结果
  • Executor 和 ExecutorService 接口第四个区别是除了允许客户端提交一个任务,ExecutorService 还提供用来控制线程池的方法。比如:调用 shutDown() 方法终止线程池
  • Executors 类提供工厂方法用来创建不同类型的线程池。比如: newSingleThreadExecutor() 创建一个只有一个线程的线程池,newFixedThreadPool(int numOfThreads)来创建固定线程数的线程池,newCachedThreadPool()可以根据需要创建新的线程,但如果已有线程是空闲的会重用已有线程

Executor、ExecutorService、Future、Callable 的全貌

一边看图一边阅读以下描述应该能便于理解大致的流程。

  • Thread 调用 Runnable 的 run 方法
  • Executor 调用 Runnable 的 run 方法
  • FutureTask 实现(implements)了 Runnable 和 Future
  • Executor 调用 Callable 的 call 方法
  • ExecutorService 调用 Callable 的call 方法,返回(return) Future
  • ExecutorService 调用 Runnable 的 run 方法,返回(return) Future
  • Executors 创建(create) ThreadFactory、ExecutorService、ScheduledExecutorService、Callable