前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java Future

Java Future

原创
作者头像
HLee
修改2021-11-04 09:58:19
8320
修改2021-11-04 09:58:19
举报
文章被收录于专栏:房东的猫

简介

在并发编程中,我们经常用到非阻塞的模型,在之前的多线程的三种实现中,不管是继承thread类还是实现runnable接口,都无法保证获取到之前的执行结果。通过实现Callback接口,并用Future可以来接收多线程的执行结果。

Future方法

Future接口主要包括5个方法

代码语言:javascript
复制
boolean cancel(boolean mayInterruptIfRunning);
cancel(boolean mayInterruptIfRunning)方法可以用来停止一个任务,如果任务可以停止(通过mayInterruptIfRunning来进行判断),则可以返回true,如果任务已经完成或者已经停止,或者这个任务无法停止,则会返回false.

boolean isCancelled();
isCancel()方法判断当前方法是否取消

boolean isDone();
isDone()方法判断当前方法是否完成

V get() throws InterruptedException, ExecutionException;
get()方法可以当任务结束后返回一个结果,如果调用时,工作还没有结束,则会阻塞线程,直到任务执行完毕

V get(long timeout, TimeUnit unit)
        throws InterruptedException, ExecutionException, TimeoutException;
get(long timeout,TimeUnit unit)做多等待timeout的时间就会返回结果

Future是Java 5添加的类,用来描述一个异步计算的结果。你可以使用isDone方法检查计算是否完成,或者使用get阻塞住调用线程,直到计算完成返回结果,你也可以使用cancel方法停止任务的执行。

代码语言:javascript
复制
public static void main(String[] args) throws Exception {
        ExecutorService executor = Executors.newSingleThreadExecutor();
        Future<String> stringFuture = executor.submit(new Callable<String>() {
            @Override
            public String call() throws Exception {
                Thread.sleep(2000);
                return "async thread";
            }
        });
        Thread.sleep(1000);
        System.out.println("main thread");
        System.out.println(stringFuture.get());

    }
}

输出:
main thread
async thread

FutureTask

Futures

Futures是guava提供的工具类,全类名是com.google.common.util.concurrent.Futures。配合MoreExecutors使用,效果极佳。

  • Futures.allAsList:对多个ListenableFuture的合并,返回一个当所有Future成功时返回多个Future返回值组成的List对象,且元素顺序同allAsList()方法入参Future实例对应。注:当其中一个Future失败或者取消的时候,将会进入失败或者取消。
代码语言:javascript
复制
public static ListenableFuture<List<V>> allAsList(ListenableFuture<V>... futures)
public static ListenableFuture<List<V>> allAsList(Iterable<ListenableFuture<V>> futures)
  • Futures.successfulAsList:和allAsList()方法有一点区别,就是组合的ListenableFuture实例的get()方法永远不会抛异常,即使之前某ListenableFuture实例对应的任务抛异常。如果某任务抛异常,则get()方法返回的集合中对应位置的值为null。极端情况下,get()方法会返回一个纯null的集合。
代码语言:javascript
复制
public static ListenableFuture<List<V>> successfulAsList(ListenableFuture<V>... futures)
public static ListenableFuture<List<V>> successfulAsList(Iterable<ListenableFuture<V>> futures)
  • Futures.addCallback:为Future增加回调。

ListenableFuture

CompleteFuture

一个Future类是显示的完成,而且能被用作一个完成等级,通过它的完成触发支持的依赖函数和行为。当两个或多个线程要执行完成或取消操作时,只有一个能够成功。

RunnableFuture

这个接口同时继承Future接口和Runnable接口,在成功执行run()方法后,可以通过Future访问执行结果。这个接口都实现类是FutureTask,一个可取消的异步计算,这个类提供了Future的基本实现,后面我们的demo也是用这个类实现,它实现了启动和取消一个计算,查询这个计算是否已完成,恢复计算结果。计算的结果只能在计算已经完成的情况下恢复。如果计算没有完成,get方法会阻塞,一旦计算完成,这个计算将不能被重启和取消,除非调用runAndReset方法。

SchedualFuture

这个接口表示一个延时的行为可以被取消。通常一个安排好的future是定时任务SchedualedExecutorService的结果

ForkJoinTask

基于任务的抽象类,可以通过ForkJoinPool来执行。一个ForkJoinTask是类似于线程实体,但是相对于线程实体是轻量级的。大量的任务和子任务会被ForkJoinPool池中的真实线程挂起来,以某些使用限制为代价。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 简介
  • Future方法
  • FutureTask
  • Futures
  • ListenableFuture
  • CompleteFuture
  • RunnableFuture
  • SchedualFuture
  • ForkJoinTask
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档