import
java
.
util
.
concurrent
.
ExecutionException
;
import
java
.
util
.
concurrent
.
ExecutorService
;
import
java
.
util
.
concurrent
.
Executors
;
import
java
.
util
.
concurrent
.
Future
;
* @author djh on 2019/4/22 10:23
* @E-Mail 1544579459@qq.com
public
class
Demo
{
public
static
void
main
(
String
[
]
args
)
throws
ExecutionException
,
InterruptedException
{
ExecutorService cachePool
=
Executors
.
newCachedThreadPool
(
)
;
Future
<
String
>
future
=
cachePool
.
submit
(
(
)
-
>
{
Thread
.
sleep
(
3000
)
;
return
"异步任务计算结果!"
;
}
)
;
doSomeThingElse
(
)
;
String result
;
long
start
=
System
.
currentTimeMillis
(
)
;
while
(
true
)
{
if
(
future
.
isDone
(
)
)
{
break
;
System
.
out
.
println
(
"轮询耗时:"
+
(
System
.
currentTimeMillis
(
)
-
start
)
)
;
result
=
future
.
get
(
)
;
System
.
out
.
println
(
"获取到异步计算结果啦: "
+
result
)
;
cachePool
.
shutdown
(
)
;
private
static
void
doSomeThingElse
(
)
{
try
{
Thread
.
sleep
(
1000
)
;
}
catch
(
InterruptedException
e
)
{
e
.
printStackTrace
(
)
;
System
.
out
.
println
(
"我的最重要的事情干完了, 我要获取异步计算结果来执行剩下的事情."
)
;
我的最重要的事情干完了, 我要获取异步计算结果来执行剩下的事情.
轮询耗时:2000
获取到异步计算结果啦: 异步任务计算结果!
Process finished with exit code 0
从上面的 Demo 中我们可以看出, future 在执行异步任务时, 对于结果的获取显的不那么优雅, 很多第三方库就针对 Future 提供了回调式的接口以用来获取异步计算结果, 如Google的: ListenableFuture, 而 Java8 所提供的 CompleteFuture 便是官方为了弥补这方面的不足而提供的 API.
package demos;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
* @author djh on 2019/5/1 20:26
* @E-Mail 1544579459@qq.com
public class CompleteFutureDemo {
public static void main(String[] args) throws ExecutionException, InterruptedException {
CompletableFuture<String> completableFutureOne = new CompletableFuture<>();
ExecutorService cachePool = Executors.newCachedThreadPool();
cachePool.execute(() -> {
try {
Thread.sleep(3000);
completableFutureOne.complete("异步任务执行结果");
System.out.println(Thread.currentThread().getName());
} catch (InterruptedException e) {
e.printStackTrace();
});
CompletableFuture<String> completableFutureTwo = completableFutureOne.whenComplete((s, throwable) -> {
System.out.println("当异步任务执行完毕时打印异步任务的执行结果: " + s);
});
CompletableFuture<Integer> completableFutureThree = completableFutureTwo.thenApply(s -> {
System.out.println("当异步任务执行结束时, 根据上一次的异步任务结果, 继续开始一个新的异步任务!");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
return s.length();
});
System.out.println("阻塞方式获取执行结果:" + completableFutureThree.get());
cachePool.shutdown();
从上面的 Demo 中我们主要需要注意 thenApply 和 whenComplete 这两个方法, 这两个方法便是 CompleteFuture 中最具有意义的方法, 他们都会在 completeFuture 调用
complete 方法传入异步计算结果时回调, 从而获取到异步任务的结果.
相比之下 future 的阻塞和轮询方式获取异步任务的计算结果, CompleteFuture 获取结果的方式就显的优雅的多.
更多详细用法: https://colobu.com/2016/02/29/Java-CompletableFuture/
Java8 中的 completeFuture 是对 Future 的扩展实现, 主要是为了弥补 Future 没有相应的回调机制的缺陷. 我们先看看 Java8 之前的 Future 的使用:package demos;import java.util.concurrent.ExecutionException;import java.util.concurrent.Execu...
CompleteFuture的用法,异步调用,等全部方法执行完获取返回值。
package com.sf.vsolution.hn.fcs;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.stream.Collectors;
大家好,我是GMaya。
本文是解决一个业务上访问慢的痛点,整体是这样的。有一个汇总微服务a,现在需要调用其他b,c,d等多个微服务接口,然后整体将数据进行整合。如果是串行调用,每个接口需要1秒,那么三个接口也要3秒了。。。
使用CompleteFuture方法,并行调用,然后数据汇总整合。
模拟场景:
1、pay支付微服务有三个接口,每个接口中模拟访问过慢的场景。
2、order分别串行方式和并行方式进行调用。
pay微服务代码
* @ Description :
CompleteFuture实现简单的任务编排实践
CompleteFuture是java8 新提供的API,是对函数式编程思想的体现,提供了很多的对于函数式编程支持。不止有同步处理功能,还有异步处理能力。
通过函数式编程可以实现线程的简单任务编排。高效,整洁实现多线程异步编程。
二:详细介绍
CompleteFuture 提供的API中以ansy结尾的都是异步处理的。
异步执行任务,并返回结果:supplyAsync 异步处理,并返回结果,默认使用ForkJoinPool.commo
CompletableFuture
这个completableFuture是JDK1.8版本新引入的类。下面是这个类。实现了俩接口。本身是个class。这个是Future的实现类。
使用completionStage接口去支持完成时触发的函数和操作。
一个completetableFuture就代表了一个任务。他能用Future的方法。还能做一些之前说的executorService配合fu...
import java.time.LocalTime;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class Java8TimeDemo {
public static void main(String[] args) {
// 获取当前日期
LocalDate date = LocalDate.now();
System.out.println("当前日期: " + date);
// 获取当前时间
LocalTime time = LocalTime.now();
System.out.println("当前时间: " + time);
// 获取当前日期时间
LocalDateTime dateTime = LocalDateTime.now();
System.out.println("当前日期时间: " + dateTime);
// 格式化日期和时间
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String formattedDateTime = dateTime.format(formatter);
System.out.println("格式化后的日期时间: " + formattedDateTime);
在这个示例中,我们使用了 `LocalDate`、`LocalTime` 和 `LocalDateTime` 类来表示日期、时间和日期时间,并使用了 `DateTimeFormatter` 类来格式化日期和时间。