9款物联网开发工具
|
主线程启动线程池子线程开始计算...子线程计算中,用时 1 秒子线程计算中,用时 2 秒子线程计算中,用时 3 秒子线程计算完成,返回:100主线程得到返回结果:100 由于 get() 方法阻塞获取结果,所以输出顺序为子线程计算完成后主线程输出结果。 使用FutureTask
由于 FutureTask 集「任务与结果」于一身,所以我们可以使用 FutureTask 自身而非返回值来管理任务,这需要首先利用 Callable 对象来构造 FutureTask,并调用不同的submit()重载方法。 二、使用举例 文章的标题有点唬人,说到底还是讲 Callable 的用法。现在我们知道了 Future 代表了任务执行的过程和结果,作为 call() 方法的返回值来获取执行结果;而 FutureTask 是一个 Runnable 的 Future,既是任务执行的过程和结果,又是 call 方法最终执行的载体。下面通过一个例子看看他们在使用上的区别。
首先创建一个任务,即定义一个任务类实现 Callable 接口,在 call() 方法里添加我们的操作,这里用耗时三秒然后返回 100 模拟计算过程。 在适配器设计模式中,通常包含目标接口 Target、适配器 Adapter 和被适配者 Adaptee 三类角色,其中目标接口代表客户端(当前业务系统)所需要的功能,通常为借口或抽象类;被适配者为现存的不能满足使用需求的类;适配器是一个转换器,也称 wrapper,用于给被适配者添加目标功能,使得客户端可以按照目标接口的格式正确访问。对于 RunnableAdapter 来说,Callable 是其目标接口,而 Runnable 则是被适配者。RunnableAdapter 通过覆盖 call() 方法使其可按照 Callable 的要求来使用,同时其构造方法中接收被适配者和目标对象,满足了 call() 方法有返回值的要求。 我们大家都知道,在 Java 中创建线程主要有三种方式:
而后两者的区别在于 Callable 接口中的 call() 方法可以异步地返回一个计算结果 Future,并且一般需要配合 ExecutorService 来执行。这一套操作在代码实现上似乎也并不难,可是对于call()方法具体怎么(被ExecutorService)执行的,以及 Future 这个结果是怎么获取的,却又不是很清楚了。 那么本篇文章,我们就一起来学习下 Callable 接口以及 Future 的使用,主要面向两个问题:
你可能会说,这两个难道不是一个问题吗?任务执行了就会有返回结果,而返回结果也一定是任务执行了才返回的,难道还能返回一个其他任务的结果么??不要着急,耐心的看下去,你就会发现,这两个还真的就是一个问题。 本文将分为两个部分,第一部分分别介绍 任务、执行、以及结果这三个概念在 Java API 中的实体和各自的继承关系,第二部分通过一个简单的例子回顾他们的用法,再理解下这两个问题的答案。 Callable、Executor 与 Future 既然是一个任务被执行并返回结果,那么我们先来看看具体的任务,也就是 Callable 接口。 任务:Callable
非常简单,只包含一个有泛型「返回值」的 call() 方法,需要在最后返回定义类型的结果。如果任务没有需要返回的结果,那么将泛型 V 设为 void 并return null;就可以了。对比的是 Runnable,另一个明显的区别则是 Callable可以抛出异常。 (编辑:四平站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
