java future函数的作用
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java future函数的作用相关的知识,希望对你有一定的参考价值。
final Future<?> future = executor.submit(new Runnable()
在并发编程时,一般使用runnable,然后扔给线程池完事,这种情况下不需要线程的结果。所以run的返回值是void类型。
如果是一个多线程协作程序,比如菲波拉切数列,1,1,2,3,5,8...使用多线程来计算。
但后者需要前者的结果,就需要用callable接口了。
callable用法和runnable一样,只不过调用的是call方法,该方法有一个泛型返回值类型,你可以任意指定。
线程是属于异步计算模型,所以你不可能直接从别的线程中得到函数返回值。
这时候,Future就出场了。Futrue可以监视目标线程调用call的情况,当你调用Future的get()方法以获得结果时,当前线程就开始阻塞,直接call方法结束返回结果。 参考技术A submit 一个请求之后,你可以在 future.get() 上阻塞等待也可以有一个 while 循环,不停地 future.isDone() 再检测是否任务完成,如果完成再来 future.get() 就立马得到结果了。追问
要是当前线程循环一次之后,再来执行这么一条语句,会得到什么样的结果。
追答这样的设计一般都约定,当使用 get() 阻塞式访问时,返回后那个任务已经完成了 (不管结果是 isDone() 还是 isCancelled())。
而当我们不是阻塞地,比如 while(!future.isDone()) Result r = future.get(1000, TimeUnit.XYZ)) 来访问的话,除非这个类是你自己写的,否则你应该按人家提供这个 Executor 和 Future 的 API 上说的来了解它当前是什么状态。假设 future.isDone 返回 false,你不应该期望你能从中得到什么。
这个 Future 并没有说明它支持“当任务还在跑并且尚未跑完成时也会告诉你中间的状态值”。所以你说的跑了一个循环(我假设你是在说你的任务是跑多个循环,并且你期望在中间的某个时刻知道里面走到哪一步了),那只有这个 Future 和 Executor 及 那个 Runnable 实现类知道具体细节,它们应该在 API 文档中说明是否达到你的要求。
而当 future.isDone() 已经完成了,那一般会默认除非你丢弃了结果,否则那个结果应该保持不变才对,如果在 done 之后的某个条件之后结果会变的话,一般应该在 API 文档中说明这个约定。
java 子线程 回调 主线程
我在创建一个对象的时候,那个对象的构造函数要执行好长时间,我单开了一个线程进行加载,并且屏幕上显示动画表示正在等待,那么如何才能在新的线程结束的时候用主线程去调用函数呢
如果主线程要等子线程完成才能继续执行又何必新开线程如果你非要这么干,java.util.concurrent.Future接口满足你的需求,具体用法百度Future 接口
Future 接口允许表示已经完成的任务、正在执行过程中的任务或者尚未开始执行的任务。通过 Future 接口,可以尝试取消尚未完成的任务,查询任务已经完成还是取消了,以及提取(或等待)任务的结果值。
FutureTask 类实现了 Future,并包含一些构造函数,允许将 Runnable 或 Callable(会产生结果的 Runnable)和 Future 接口封装。因为 FutureTask 也实现 Runnable,所以可以只将 FutureTask 提供给 Executor。一些提交方法(如 ExecutorService.submit())除了提交任务之外,还将返回 Future 接口。
Future.get() 方法检索任务计算的结果(或如果任务完成,但有异常,则抛出 ExecutionException)。如果任务尚未完成,那么 Future.get() 将被阻塞,直到任务完成;如果任务已经完成,那么它将立即返回结果。 参考技术A 为什么不用wait() 和notify()
以上是关于java future函数的作用的主要内容,如果未能解决你的问题,请参考以下文章
Callable, Runnable, Future, FutureTask