CompletableFuture
类是在 Java 8 引入的。用于表示一个 Feture
的状态,可以通过设置其值或状态来明确表示 Feture
处于完成状态
说起来特拗口,理解起来就简单了
那个,Java 8 不是引入了并发编程了,对吧。并发编程里有一个概念就是并发执行是否完成了。这个是否完成了是由 java.util.concurrent.CompletionStage
来表示的。然后呢,CompletableFuture
是 CompletionStage
的父类。
如果你对 Java 的并发编程熟悉,那么一定直到,当并发完成时可以支持一个回调,这个回调也是由 CompletableFuture
提供的。
有时候会觉得,一个特性,应该在它出现的时候就比较完善了,直到别人提出了新的思维,才觉得原来还有改进的空间,就比如这个 CompletableFuture
吧
Java 9 竟然还给它添加了一些东西:
- 支持延误和超时 ( timeout ) 机制
- 支持子类化
- 添加了一些新的工厂方法
支持延误和超时机制
这两个功能是通过新增两个方法来达成的
方法 | 说明 |
---|---|
completeOnTimeout(Tvalue,longtimeout,TimeUnitunit) | 如果在指定时间内没完成,则返回一个指定的值 |
orTimeout(longtimeout,TimeUnitunit) | 如果在指定的时间内没完成,则抛出一个异常TimeoutException |
这两个方法的看起来是差不多的,都是在指定时间内没完成则执行一个动作,只不过前者是返回一个指定的值,后者则直接抛出异常
这两个方法的原型如下
public CompletableFuture<T> completeOnTimeout(T value, long timeout, TimeUnit unit)
public CompletableFuture<T> orTimeout(long timeout, TimeUnit unit)
范例
在我们的工作目录创建一个文件 CompletableFutureTimeoutTester.java
并输入以下内容
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
class CompletableFutureTimeoutTester {
public static void main(String[] args) {
try {
CompletableFuture<Integer> future = CompletableFuture.supplyAsync(CompletableFutureTimeoutTester::computeEndlessly)
.orTimeout(1, TimeUnit.SECONDS);
future.get(); // 显式等待超时
} catch ( Exception e )
{
System.out.println(e);
}
try {
int defaultValue = 7;
CompletableFuture<Integer> future = CompletableFuture.supplyAsync(CompletableFutureTimeoutTester::computeEndlessly)
.completeOnTimeout(defaultValue, 1, TimeUnit.SECONDS);
Integer result = future.get(); // 显式等待超时
System.out.println(result);
} catch ( Exception e )
{
System.out.println(e);
}
}
private static Integer computeEndlessly() {
try {
Thread.sleep(Integer.MAX_VALUE);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
return 42;
}
}
运行结果如下
[yufei@www.twle.cn java9]$ javac CompletableFutureTimeoutTester.java && java CompletableFutureTimeoutTester
java.util.concurrent.ExecutionException: java.util.concurrent.TimeoutException
7
从运行的结果中可以看到,如果执行超时, orTimeout()
方法直接抛出了一个异常,而 completeOnTimeout()
方法则是返回默认值
Java 面试宝典是大明哥全力打造的 Java 精品面试题,它是一份靠谱、强大、详细、经典的 Java 后端面试宝典。它不仅仅只是一道道面试题,而是一套完整的 Java 知识体系,一套你 Java 知识点的扫盲贴。
它的内容包括:
- 大厂真题:Java 面试宝典里面的题目都是最近几年的高频的大厂面试真题。
- 原创内容:Java 面试宝典内容全部都是大明哥原创,内容全面且通俗易懂,回答部分可以直接作为面试回答内容。
- 持续更新:一次购买,永久有效。大明哥会持续更新 3+ 年,累计更新 1000+,宝典会不断迭代更新,保证最新、最全面。
- 覆盖全面:本宝典累计更新 1000+,从 Java 入门到 Java 架构的高频面试题,实现 360° 全覆盖。
- 不止面试:内容包含面试题解析、内容详解、知识扩展,它不仅仅只是一份面试题,更是一套完整的 Java 知识体系。
- 宝典详情:https://www.yuque.com/chenssy/sike-java/xvlo920axlp7sf4k
- 宝典总览:https://www.yuque.com/chenssy/sike-java/yogsehzntzgp4ly1
- 宝典进展:https://www.yuque.com/chenssy/sike-java/en9ned7loo47z5aw
目前 Java 面试宝典累计更新 400+ 道,总字数 42w+。大明哥还在持续更新中,下图是大明哥在 2024-12 月份的更新情况:
想了解详情的小伙伴,扫描下面二维码加大明哥微信【daming091】咨询
同时,大明哥也整理一套目前市面最常见的热点面试题。微信搜[大明哥聊 Java]或扫描下方二维码关注大明哥的原创公众号[大明哥聊 Java] ,回复【面试题】 即可免费领取。