完全搞懂Future、Callable、FutureTask、Runnable

引言

  • 看到标题一会儿好几个名称,极可能你都知道、都听过、看过,可是你真是理清楚了它们的关系了吗?
  • 在这个知识泛滥、技术焦虑的时刻,人人嘴里喷着高并发、大数据、分布式,不少估计对这个一头雾水,不管在开发仍是面试过程当中,只知其一;不知其二还不如不知。

Runnable/Thread

  • 一般状况下的耗时操做会交给多线程来处理,Java中开启一个新线程很容易,继承自Thread或实现Runnable接口。下面是常规操做。

  • 开启多线程不少时候是为了利用CPU的多核能力。new Thread()或实现Runnable很容易实现,那为什么还须要Future、Callable呢?是JDK开发者嫌头发多了吗?
  • 一般状况下咱们只管一顿操做,开启线程扔出去,至于返回值咱们开发中好像历来没管过。其实不管是new Thread()仍是实现Runnable在执行完了都是没法获取执行结果的,不是咱们不想管而是管不了。至于线程执行成功仍是失败,不少时候都是听天由命,由于大多状况下咱们默认这个执行操做确定会成功。出了问题也只能追日志了。
  • 经过共享变量或者线程通讯的方式却是能够间接获取执行结果,可是相信我以你的水平,怕是要996解bug。

Future机制

Callable

  • 那既然到这里了,相信你也能猜到Java 1.5中引入的Callable就是解决这个返回值的问题,

  • Callable是一个接口,一个函数式接口,也是个泛型接口。call()有返回值,且返回值类型与泛型参数类型相同,且能够抛出异常。Callable能够看做是Runnable接口的补充。

Future

  • 也许Future的知名度更高,一般所说的Future机制而不是Callable机制。既然Callable能够解决无返回值的问题,那么Future又是什么呢?
  • Future是为了配合Callable/Runnable而产生的,既然有返回值,那么返回什么?何时返回?这些问题其实均可以算在Future机制里。
  • 简单来说我认为Future是一个句柄,即Callable任务返回给调用方这么一个句柄,经过这个句柄咱们能够跟这个异步任务联系起来,咱们能够经过future来对任务查询、取消、执行结果的获取,是调用方与异步执行方之间沟通的桥梁。

FutureTask

  • 到如今基本清晰了,Future机制就是为了解决多线程返回值的问题。可是Callable、Future、RunnableFuture都是接口,接口不干活啊。不要紧,FutureTask来了。

  • FutureTask实现了RunnableFuture接口,同时具备Runnable、Future的能力,即既能够做为Future获得Callable的返回值,又能够做为一个Runnable。面试

  • FutureTask是一个泛型类,下面是一个demo。多线程

小结

  • Future机制并非对Runnable的革名,只是对Runnable的扩展。Callable、Future、FutureTask的配合,解决Runnable无返回值的问题。
  • Callable、Future、RunnableFuture都是接口,是FutureTask在背后默默的干活。
  • 名词虽然多了点,可是其实并无那么复杂,看完本文彻底能够搞清楚他们的关系。在多线程开发中可以清晰地知道采起最好的方式。
相关文章
相关标签/搜索