Java并发编程 之Future、ListenableFuture

Future模式

Java 1.5开始,提供了CallableFuture,通过它们可以在任务执行完毕之后得到任务执行结果。
Future接口可以构建异步应用,是多线程开发中常见的设计模式。
当我们需要调用一个函数方法时。如果这个函数执行很慢,那么我们就要进行等待。但有时候,我们可能并不急着要结果。
因此,我们可以让被调用者立即返回,让他在后台慢慢处理这个请求。对于调用者来说,则可以先处理一些其他任务,在真正需要数据的场合再去尝试获取需要的数据。
在这里插入图片描述

在这里插入图片描述

Callable与Runnable

java.lang.Runnable是一个接口,在它里面只声明了一个run()方法,run返回值是void,任务执行完毕后无法返回任何结果。检查异常必须处理。
在这里插入图片描述
Callable位于java.util.concurrent包下,它也是一个接口,在它里面也只声明了一个方法叫做call(),这是一个泛型接口,call()函数返回的类型就是传递进来的V类型。检查异常可以抛出去。
在这里插入图片描述

Future + Callable

Future就是对于具体的Runnable或者Callable任务的执行结果进行取消、查询是否完成、获取结果。必要时可以通过get方法获取执行结果,该方法会阻塞直到任务返回结果。
在这里插入图片描述
一般情况下Future 是配合ExecutorService来使用的,在ExecutorService接口中声明了若干个submit方法的重载版本。

<T> Future<T> submit(Callable<T> task);
<T> Future<T> submit(Runnable task, T result);
Future<?> submit(Runnable task);

Future+Callable,使用示例:
单个Future案例:

// 方式一
ExecutorService executor = Executors.newCachedThreadPool();
Future<Integer> future = executor.submit(() -> new Random().nextInt());
executor.shutdown();
System.out.println("result:" + future.get());
// FutureTask方式二
ExecutorService executor = Executors.newCachedThreadPool();
FutureTask<Integer> futureTask = new FutureTask<>(() -> new Random().nextInt());
executor.submit(futureTask);
executor.shutdown();
System.out.println("result:" + futureTask.get());

多个Future案例:

ExecutorService executor = Executors.newCachedThreadPool();
List<Future<Integer>> futureList = new ArrayList<>();
for (int i = 0; i < 10; i++) {
    futureList.add(executor.submit(() -> new Random().nextInt()));
}
executor.shutdown();

for (int i = 0; i < 10; i++) {
    Integer result = futureList.get(i).get();
    System.out.println("第" + i + "个结果: " + result);
}

Future接口的局限性

比如主线程要等各个异步执行线程返回的结果来做下一步操作,就必须阻塞在future.get()方法等待结果返回,这时其实又是同步了,如果遇到某个线程执行时间太长时,那情况就更糟了。

Java8时引入了一个新的实现类CompletableFuture,弥补了上面的缺点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值